我有一个简单的Oracle查询:
SELECT SEQ_01.NEXTVAL FROM DUAL
我希望在SQL标准中编写此查询,以便在DB
中运行它答案 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工作。
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;
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
调用大幅慢。