将oracle sql查询迁移到PostgreSql

时间:2015-04-20 16:12:02

标签: sql oracle postgresql

我有一个简单的Oracle查询:

SELECT SEQ_01.NEXTVAL FROM DUAL

我希望在SQL标准中编写此查询,以便在DB

中运行它

1 个答案:

答案 0 :(得分:3)

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

select nextval('seq_01');

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

你无法编写同样适用于两个DBMS的SQL语句。它们都没有实现SQL标准为序列定义的语法


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

对于Oracle

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;

对于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;

请注意,您为DBMS独立SQL支付通常的价格:它在所有平台上运行速度都相同。特别是使用PL / SQL和动态SQL的Oracle解决方案将比普通seq_01.nextval调用大幅慢。