通过存储过程检索 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 序列的下一个值的主要内容,如果未能解决你的问题,请参考以下文章