我通常是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
答案 0 :(得分:0)
您的行为没有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
限制可能与你的角色集有关。 SQL Developer默认允许更多。
无论如何,请指定变量的大小:
var x varchar2(30);
exec CHK_LASTAPPTIME(:x);
您似乎在您的过程中生成一个数字,然后将其作为字符串返回。使用相同的数据类型会使这更简单。