当没有定义IN参数时,存储过程需要参数



我在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);

最新更新