Oracle 存储过程上的编译错误

Oracle 存储过程上的编译错误,oracle,syntax,procedure,Oracle,Syntax,Procedure,我通常是一名SQL Server开发人员,但我现在使用的是一个使用Oracle的系统。我已经创建了一个新的过程,并且得到了一个运行时错误。程序如下: CREATE OR REPLACE PROCEDURE CHK_LASTAPPTIME ( LASTAPPTIME OUT VARCHAR2 ) IS v_appappid varchar2(20) null; v_lastapptime number null; BEGIN select max(APPID

我通常是一名SQL Server开发人员,但我现在使用的是一个使用Oracle的系统。我已经创建了一个新的过程,并且得到了一个运行时错误。程序如下:

CREATE OR REPLACE PROCEDURE CHK_LASTAPPTIME 
(
    LASTAPPTIME OUT VARCHAR2  
) 
IS
    v_appappid varchar2(20) null;
    v_lastapptime number null;
BEGIN
    select max(APPID) into v_appappid from applicationtable;

    select trunc(v_lastapptime = (((sysdate - capturedate) * 24)) * 60) from applicationtable where APPID = v_appappid;

    LASTAPPTIME := to_char(v_lastapptime);

END CHK_LASTAPPTIME;
以下是我得到的错误:

SQL> var x varchar2;
SQL> exec CHK_LASTAPPTIME(:x);
BEGIN CHK_LASTAPPTIME(:x); END;

*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "CAPDEV.CHK_LASTAPPTIME", line 19
ORA-06512: at line 1

您的proecedure没有19行,因此消息很奇怪,或者您显示的代码与实际运行的代码不同。因为你所展示的并不是编译的,我假设你已经试着为了这个问题把它删减了,我还假设你的实际过程是有效的,并且做了你想做的事情

问题出在运行时变量声明中。您尚未为
x
指定大小,因此它使用默认值。在我的数据库中,在SQL*Plus中,似乎允许使用三个字符,但错误为四个或更多:

var x varchar2;

exec :x := 'a';
PL/SQL procedure successfully completed.
exec :x := 'ab';
PL/SQL procedure successfully completed.
exec :x := 'abc';
PL/SQL procedure successfully completed.
exec :x := 'abcd';
BEGIN :x := 'abcd'; END;

*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 1
限制可能与您的角色集有关。默认情况下,SQLDeveloper允许更多

无论如何,请指定变量的大小:

var x varchar2(30);
exec CHK_LASTAPPTIME(:x);

您似乎在过程中生成一个数字,然后将其作为字符串返回。使用相同的数据类型会使这一点更简单。

酷!是的,我确实缩小了代码以便于发布,并且过程是有效的。指定X的大小可以消除错误。谢谢