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

时间:2015-05-19 08:50:55

标签: oracle stored-procedures

我在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函数而不会出现问题。

3 个答案:

答案 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变量
  • 匿名阻止

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

你没有设置参数,这将取出值。