我在Oracle中有这个非常简单的存储过程,它执行一个序列并将下一个序列号作为输出。
create or replace PROCEDURE NEXT_NUMBER
(SEQUENCE_OUT OUT NUMBER)
IS
BEGIN
EXECUTE IMMEDIATE 'SELECT TEST_SEQUENCE.NEXTVAL FROM DUAL' INTO sequence_out;
END;
正如您所看到的,此过程没有IN参数,所以当我执行此过程时我感到很困惑:执行CRS_NEXT_CRC_NUMBER;
我收到以下错误:
Error starting at line : 1 in command -
execute NEXT_NUMBER
Error report -
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'CRS_NEXT_CRC_NUMBER'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
知道为什么会这样吗?我可以在程序之外的SEQUENCE上调用NEXTVAL函数而不会出现问题。
答案 0 :(得分:3)
create or replace PROCEDURE NEXT_NUMBER
(SEQUENCE_OUT OUT NUMBER)
IS
BEGIN
SELECT TEST_SEQUENCE.NEXTVAL INTO sequence_out FROM DUAL;
-- or simply (in newer Oracle releases)
sequence_out := TEST_SEQUENCE.NEXTVAL;
END;
在SQLPLUS中:
> var ID NUMBER
> exec NEXT_NUMBER(:ID);
> print ID
答案 1 :(得分:1)
PLS-00306:调用' CRS_NEXT_CRC_NUMBER'
的参数数量或参数类型错误
您尚未声明OUT参数,程序需要参数,即OUT参数SEQUENCE_OUT
。
您可以通过两种方式使用OUT参数执行该过程。
在 SQL * Plus中:
var SEQUENCE_OUT number
exec next_number(:SEQUENCE_OUT);
print SEQUENCE_OUT
匿名阻止:
SET SERVEROUTPUT ON
DECLARE
SEQUENCE_OUT NUMBER;
BEGIN
next_number(SEQUENCE_OUT);
DBMS_OUTPUT.PUT_LINE(SEQUENCE_OUT);
END;
/
答案 2 :(得分:0)
你几乎完成了。你需要调用像
这样的方法execute NEXT_NUMBER(:val);
你没有设置参数,这将取出值。