ORA-06502:PL / SQL:数字或值错误 - oracle

时间:2016-08-11 13:36:27

标签: oracle function stored-procedures plsqldeveloper

我正在尝试使用存储过程获取表的依赖项。对于我的sp,我已将模式名称和表名称作为输入,并将约束相关变量作为输出。我还添加了一个光标来返回多行。

我的sp运行正常,但是当我尝试执行存储过程时,它会出错:

     ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.TEST", line 23
ORA-06512: at line 10
06502. 00000 -  "PL/SQL: numeric or value error%s"

这是尝试执行存储过程的方法:      - 尝试执行存储过程

 Set  serveroutput on
        declare 
        V_constraintname varchar2(20);
        V_rowner  varchar2(20);
        V_rconstraintname  varchar2(20);
        V_columnname  varchar2(20);
        V_tabname  varchar2(20);
        V_refcsr SYS_REFCURSOR;
        begin
        dbms_output.enable;
        Test('ABC','XYZ',V_constraintname,V_rowner,V_rconstraintname,V_columnname,V_tabname,V_refcsr);

         dbms_output.put_line(V_constraintname) ;
         dbms_output.put_line(V_rowner) ;
         dbms_output.put_line(V_rconstraintname) ;
         dbms_output.put_line(V_columnname) ;
         dbms_output.put_line(V_tabname) ;
         --dbms_output.put_line(V_refcsr) ;
        end;
        /

前两个值是输入,剩余的是存储过程的输出参数。

2 个答案:

答案 0 :(得分:1)

由于约束,列和表等名称最长可达30个字符,我建议您也为该长度声明变量。

 V_constraintname varchar2(30);
 V_rowner  varchar2(30);
 V_rconstraintname  varchar2(30);
 V_columnname  varchar2(30);
 V_tabname  varchar2(30);

What is the maximum length of a table name in Oracle?

答案 1 :(得分:1)

数据字典中的值大于您在匿名块中声明的变量。

避免这种情况的最简单方法是使用%TYPE语法,根据最终将收到数据的列的数据类型声明它们:

declare 
    V_constraintname   all_constraints.constraint_name%type;
    V_rowner           all_constraints.r_owner%type;
    V_rconstraintname  all_constraints.r_constraint_name%type;
    V_columnname       all_cons_columns.column_name%type;
    V_tabname          all_constraints.table_name%type;
    V_refcsr           SYS_REFCURSOR;
begin
...