【问题标题】:ORA-06502: PL/SQL: numeric or value error: character string buffer too small errorORA-06502: PL/SQL: 数字或值错误: 字符串缓冲区太小错误
【发布时间】:2011-03-31 09:26:27
【问题描述】:

我有一个 oracle 函数,如下所示。当我在 sql-developer 中运行它时,它给出了一个错误

ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太 小错误。

但是,函数中的DBMS_OUTPUT.PUT_LINE(FINAL_RESULT) 行正在输出窗口中打印预期的输出。

谁能帮帮我?

create or replace
FUNCTION AVERAGE_WORKFORCE(PERIOD in varchar2, YR in varchar2)  RETURN CLOB AS 
FINAL_RESULT CLOB:=null;
STRING_QUERY_TEXT CLOB:=null;
OUTPUT_RESULT CLOB:=null;
BEGIN
    FINAL_RESULT:='<FINAL_RESULT><HEADER><NAME> </NAME> <NAME>SENIOR DIRECTOR</NAME> <NAME>DIRECTOR</NAME> <NAME>EXECUTIVE</NAME> <NAME>MANAGER</NAME><NAME>CASHIER</NAME><NAME>EMPLOYEE</NAME></HEADER>';    
    STRING_QUERY_TEXT:='SELECT XMLElement("tuple",XMLElement("DESC",''Average number of registered employees''),  XMLElement("PERMANENT_EMP",GET_COUNT_AVERAGE_WORKFORCE('''||PERIOD||''','''||YR||''',''SENIOR DIRECTOR'')),  XMLElement("PERMANENT_EMP",GET_COUNT_AVERAGE_WORKFORCE('''||PERIOD||''','''||YR||''',''DIRECTOR'')),  XMLElement("PERMANENT_EMP",GET_COUNT_AVERAGE_WORKFORCE('''||PERIOD||''','''||YR||''',''MANAGER'')),  XMLElement("PERMANENT_EMP",GET_COUNT_AVERAGE_WORKFORCE('''||PERIOD||''','''||YR||''',''EXECUTIVE'')),  XMLElement("PERMANENT_EMP",GET_COUNT_AVERAGE_WORKFORCE('''||PERIOD||''','''||YR||''',''CASHIER'')),  XMLElement("PERMANENT_EMP",GET_COUNT_AVERAGE_WORKFORCE('''||PERIOD||''','''||YR||''',''EMPLOYEE''))) FROM DUAL';     
    EXECUTE_QUERY_RETURN_RESULT(STRING_QUERY_TEXT,OUTPUT_RESULT);       
    FINAL_RESULT:=FINAL_RESULT||''||OUTPUT_RESULT; 
    FINAL_RESULT:=FINAL_RESULT||''||'</FINAL_RESULT>';
    DBMS_OUTPUT.PUT_LINE(FINAL_RESULT);
    RETURN FINAL_RESULT;
END AVERAGE_WORKFORCE;

【问题讨论】:

  • 你是怎么调用函数的?
  • 我直接从 sql-developer 运行这个函数..
  • 程序EXECUTE_QUERY_RETURN_RESULT的规范是什么?
  • 我的意思是,你能发布你对函数的调用吗?它是直接选择,还是匿名块中的赋值?看起来你可能正在做类似declare x varchar2(255); begin x:= average_workforce(&lt;period&gt;,&lt;year&gt;); end;/ 的事情,如果 varchar 小于结果,则会给出该错误。但需要看看你实际上在做什么。看来函数没问题,所以一定是调用者在抱怨?

标签: oracle plsql


【解决方案1】:

向亚历克斯和托尼道歉(他们显然也有同样的想法)。

您的代码显示了预期的输出,因此 DBMS_OUTPUT 行必须成功。

DBMS_OUTPUT.PUT_LINE(FINAL_RESULT);

QED 在此之后发生异常。我们在函数中多了一行。

RETURN FINAL_RESULT;

一个有根据的猜测是问题正如 Alex 所提到的那样 - 结果对于 SQL Developer 中调用代码中定义的变量来说太大了(即它不是 CLOB,而是一个对于结果来说太小的字符串) .

如果这是生成的代码,则可能是 SQL Developer 和 CLOB 函数的错误。

您是否尝试过执行 FROM DUAL 的 SELECT 函数?

【讨论】:

  • 已接受道歉;不确定检查返回值 所做的操作是否显而易见
  • 工具生成的代码失败可能并不明显,尤其是Oracle自己的工具!
【解决方案2】:

试试这个 DBMS_OUTPUT.ENABLE(200000);

【讨论】:

  • OP 正在控制台中获取输出,并且达到 DBMS_OUTPUT 限制会引发它自己的异常,而不是 -06502。我想我们现在有了答案。
【解决方案3】:

最简单的解决方法是通过插入一些换行符将行长度限制为 255 个字符。见this

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 2015-05-16
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多