通过存储过程检索 Oracle 序列的下一个值

Posted

技术标签:

【中文标题】通过存储过程检索 Oracle 序列的下一个值【英文标题】:Retrieve next value of Oracle sequence via stored procedure 【发布时间】:2015-03-10 17:00:24 【问题描述】:

我在 Oracle11g 中创建了一个按预期工作的 SEQUENCE。挑战在于我需要通过存储过程检索序列的下一个值(因为我使用的应用程序只能调用存储过程而不是 sql 语句)。

我已经翻遍了,我找到的最接近的是这个(这里:https://community.oracle.com/thread/2216649):

CREATE OR REPLACE PROCEDURE CSDWH.CSDWH_RETURN_SEQ_NUM 
(SEQ_NAME IN VARCHAR2,SEQUENCE_OUT OUT NUMBER) 
IS 
BEGIN   
EXECUTE IMMEDIATE 'SELECT ' || SEQ_NAME || '.NEXTVAL from dual' INTO sequence_out; 
END;

问题在于执行方式:

declare
  l_val number;
begin
  csdwh_return_seq_num( 'FOO_SEQ', l_val );
  dbms_output.put_line( l_val );
end;

我需要执行存储过程的应用程序只有一个连接字符串别名、一个存储过程名称和一个需要指定的返回参数字段。执行这个存储过程的方式需要 6 行代码。

有没有什么办法可以通过 EXECUTE 命令实现以上功能?

i.e. EXECUTE CSDWH.CSDWH_RETURN_SEQ_NUM 

那会返回值吗?

【问题讨论】:

你不会得到比贾斯汀凯夫给你的更好的答案。我不知道他为什么建议使用立即执行而不是选择进入。按照他的建议使用函数有什么问题? execute 是一个 SQLPlus 命令。您是否真的使用 SQLPlus(或模拟某些 SQL*Plus 命令子集的工具)来执行您的过程?存储过程不返回任何内容(尽管如您所见,它可以有 OUT 参数)。存储的函数确实会返回一些东西,这就是为什么最初的建议是使用函数。您的工具是否可以直接调用函数而不将其放入 SQL 语句中很难猜测。 【参考方案1】:

只创建一个函数而不是过程

CREATE OR REPLACE FUNCTION GET_SEQ(SEQ_NAME IN VAECHAR2) AS
DECLARE
    seq_out NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'SELECT ' || SEQ_NAME || '.NEXTVAL from dual' INTO seq_out;
    RETURN seq_out;
END;

那么你可以使用select get_seq('foo_seq') from dual

【讨论】:

以上是关于通过存储过程检索 Oracle 序列的下一个值的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle存储过程中drop 序列和新建序列

Oracle怎么导出存储过程

从 Oracle 存储过程中检索数组列表 - Java

Oracle 12 PL/SQL 在触发器中检索存储过程名称

如何在一个 SQL 查询中检索值并在存储过程中使用它?

JDBC取消Oracle存储过程调用