2015-06-11 30 views
-2

如果我想使用异常处理来捕获此错误,我需要照顾的事情是什么?错误的数字或参数类型的调用(当调用过程/函数时)

wrong number or types of arguments in call (while calling a procedure/function)

我试着以不同的方式。你能解释一下吗?我有一个函数:

create or replace function test5(v varchar2) return varchar as 
begin 
    execute immediate 'begin sweet.g:=:v;end;' 
    using in v; 
    return sweet.g; 
exception 
when others then 
    return sqlcode||' '||sqlerrm; 
end test5; 

和包装规格和身体:

create or replace package SWEET as 
    function c (v varchar2,V2 VARCHAR2) return varchar2; 
    g varchar(100); 
end; 
/

create or replace package body SWEET as 
    function c(v varchar2, V2 varchar2) return varchar2 as 
    begin 
    return v||'hi'|| V2; 
    end c; 
end; 
/

当我执行下面的语句,我没能赶上

“的参数类型或数值错误”
select test5(sweet.c(,'hello')) from dual; 
+0

该函数不会编译,因为:'PLS-00201:标识符'必须声明'SWEET.G'。你需要在函数中声明它。你如何执行'select'语句?你只是运行单个查询还是它在一个PL/SQL块?当我尝试它时,我得到'SQL错误:ORA-00936:缺少表达式。“ –

回答

0

您应该能够在PL/SQL手册中获得大多数答案,但是当您试图捕获不是预定义错误之一的错误时,您必须执行以下操作:

DECLARE 
    deadlock_detected EXCEPTION; 
    PRAGMA EXCEPTION_INIT(deadlock_detected, -60); 
BEGIN 
    ... -- Some operation that causes an ORA-00060 error 
EXCEPTION 
    WHEN deadlock_detected THEN 
     -- handle the error 
END; 

用你的实际错误替换-60,用你想调用它的任何东西替换掉-。

+0

这对于'PLS-'类型错误不起作用。 –

+0

这是因为如果你得到PLS错误,你实际上并没有运行。 :) 如果您使用的是动态代码,那么您可以捕捉它,当我尝试时会显示-6550。如果你真的只想抓住这个,你必须通过'SQLERRM'搜索并找到'PLS-00306'。 – Seeds

+0

我的观点是,如果你在你的BEGIN块中调用一个proc,并且你不提供足够的参数,那么你将不会在你的EXCEPTION块中结束。 –

0

比方说,你有两个数字需要作为参数,并将其输出的程序:

create procedure testProc (p_param1 in number, p_param2 in number) is 
begin 
    dbms_output.put_line('params: ' || p_param1 || ' ' || p_param2); 
end; 

如果执行此:

begin 
    testProc(13,188); 
end; 

你得到的输出:params: 13 188

如果你这样做:

begin 
    testProc(13); 
exception when others then 
    dbms_output.put_line('SQLERRM: ' || SQLERRM); 
end; 

你得到一个错误:PLS-00306: wrong number or types of arguments in call to 'TESTPROC'

为了防止这一点,并捕获错误,你可以使用动态SQL:

declare 
    v_sql varchar2(50); 
    v_result number; 
begin 
    v_sql := 'begin testProc(13); end;'; 
    execute immediate v_sql into v_result; 
exception 
when others then 
    dbms_output.put_line('SQLERRM: ' || SQLERRM); 
end; 

,将执行,并会显示错误消息DBMS_OUTPUT。在when others then块中,您可以编写任何您需要的逻辑,以便在此时发生。

相关问题