将 oracle sql 查询迁移到 PostgreSql

Mau*_*olo 0 sql oracle postgresql

我有一个简单的 Oracle 查询:

SELECT SEQ_01.NEXTVAL FROM DUAL
Run Code Online (Sandbox Code Playgroud)

我想用 SQL 标准编写这个查询,以便在两个数据库中运行它

小智 5

Oracle 的等价物select seq_01.nextval from dual是:

select nextval('seq_01');
Run Code Online (Sandbox Code Playgroud)

手册中的更多详细信息:http://www.postgresql.org/docs/current/static/functions-sequence.html

您无法编写在两个 DBMS 中同样有效的 SQL 语句。它们都没有实现 SQL 标准为序列定义的语法


使用您自己的函数,您实际上可以使相同的 SQL 在两个 DBMS 中工作。

对于甲骨文

create or replace function seq_nextval(p_sequence_name varchar)
  return integer
as
  l_statement varchar(4000);
  l_value     integer;
begin 
  l_statement := 'select '||upper(p_sequence_name)||'.nextval from dual';
  execute immediate l_statement
    into l_value;
  return l_value;
end;
/  

select seq_nextval('seq_01')
from dual;
Run Code Online (Sandbox Code Playgroud)

对于 Postgres

create table dual (dummy varchar(1));
insert into dual values ('X');

create function seq_nextval(p_sequence_name text)
  returns bigint
as
$$
   select nextval(p_sequence_name);
$$
language sql;

select seq_nextval('seq_01')
from dual;
Run Code Online (Sandbox Code Playgroud)

请注意,您为 DBMS 独立 SQL 付出了通常的代价:它在所有平台上运行速度同样慢。特别是 Oracle 使用 PL/SQL 和动态 SQL 的解决方法将比普通调用慢得多seq_01.nextval