PLS-00306:调用Oracle SP时参数的数量或类型错误

时间:2018-06-14 23:31:48

标签: oracle stored-procedures

我正在尝试执行以下CREATE OR REPLACE PROCEDURE denodo.CLEAR_INDEX ( INDEX_NAME1 IN VARCHAR2, INDEX_NAME2 IN VARCHAR2, IT_WORKED OUT BOOLEAN ) as BEGIN IT_WORKED := FALSE; EXECUTE IMMEDIATE 'drop index ' || INDEX_NAME1; EXECUTE IMMEDIATE 'drop index ' || INDEX_NAME2; IT_WORKED := TRUE; EXCEPTION WHEN OTHERS THEN IT_WORKED := FALSE; END CLEAR_INDEX; 并且它会抛出以下错误:

{{1}}
  

CLEAR_INDEX#0 [JDBC ROUTE] [ERROR]收到异常消息'ORA-06550:第1行第7列:       PLS-00306:调用'CLEAR_INDEX'时参数的数量或类型错误       ORA-06550:第1行第7列:       PL / SQL:忽略语句

这里发生了什么?感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

当您将BOOLEAN数据类型作为OUT参数处理时,您通常会遇到此错误,并且您尝试使用任何其他内置Oracle软件包进行打印或执行任何操作。您无法在BOOLEAN或任何其他dbms_output.put_line包中直接使用DBMS数据类型。例如,如果要打印OUT参数,则需要使用sys.diutil.bool_to_int。 请参阅下面的示例,该示例演示了您尝试执行时遇到的错误,如下所示:

DECLARE
  inx VARCHAR2(100):='ABC';
  var BOOLEAN;  
BEGIN
  CLEAR_INDEX(INDEX_NAME1=>inx ,IT_WORKED =>var);    
  dbms_output.put_line(var);
END;

你遇到了这个问题:

ORA-06550: line 6, column 3:
PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'
ORA-06550: line 6, column 3:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action

要解决此类问题,您必须执行以下操作:

DECLARE
  inx VARCHAR2(100):='ABC';
  var BOOLEAN;
  var1 varchar2(10);
BEGIN
  CLEAR_INDEX(INDEX_NAME1=>inx ,IT_WORKED =>var);  

  var1:=CASE WHEN (sys.diutil.bool_to_int(var)) = 1 THEN 'TRUE'
             WHEN (sys.diutil.bool_to_int(var)) = 0 THEN  'FALSE'
             END;  
    dbms_output.put_line(var1);
END;

输出:

anonymous block completed

答案 1 :(得分:0)

我的情况与此类似,但是对函数的调用不同,该函数的返回类型为Boolean且函数的输入为varchar2。 所以,这就是我在做什么:

Declare
v_ret1 varchar2(1000);
v_ret BOOLEAN;
Begin
v_ret := CASE WHEN SEI_PROCESS_MF_MNL_INVC_PKG.f_process_mf_mnl_invc(v_ret1) = 1 THEN 'TRUE' 
              WHEN SEI_PROCESS_MF_MNL_INVC_PKG.f_process_mf_mnl_invc(v_ret1) = 0 THEN 'FALSE' 
              END;
dbms_output.put_line(v_ret); 
end;

我只是想查看v_ret的输出,以便可以将其用于进一步的决策。如果v_ret的类型为Boolean,则输出应为“ TRUE”或“ FALSE”。