我正在尝试执行以下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:忽略语句
这里发生了什么?感谢你的帮助。
答案 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”。