我在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参数,所以当我像这样执行这个过程时,我很困惑:
,得到以下错误:
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函数而不会出现问题。
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
PLS-00306:调用'CRS_NEXT_CRC_NUMBER'时参数数量或类型错误
您没有声明OUT参数,程序需要一个参数,即OUT参数SEQUENCE_OUT
。
可以用两种方式执行带有OUT参数的过程。
- <
- SQL * +变量/gh>匿名块
strong> SQL * +:
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;
/
你几乎做对了。你需要调用像
这样的方法execute NEXT_NUMBER(:val);