1

这是代码……这不是完整的代码。我将它修剪到第一个错误发生的位置:

 FUNCTION get (  
    p_sql_o                         OUT VARCHAR2
  ) RETURN VARCHAR2 AS
  str_sql           VARCHAR2(4000);
  BEGIN
    str_sql := ' SELECT * FROM ( SELECT A.*, ROWNUM RNUM FROM ( ' ||
               ' SELECT item_code, ' ||
               ' item_desc, ' ||
               ' monitor, ' ||
               ' measured, ' ||
               ' inventory, ' ||
               ' (measured - inventory) adj_amount, ' ||
               ' (inventory_cost * measured) measured_cost, ' ||
               'inventory';
    RETURN str_sql;
  EXCEPTION
    WHEN OTHERS THEN
    RETURN NULL;
  END get;

显然,SQL 是不完整的,但我没有运行它。我只是返回 SQL 字符串,但仍然出现错误:

ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小 ORA-06512:在第 6 行

这令人费解。有没有人知道为什么会这样?

4

3 回答 3

1

既然您说过您没有尝试动态执行您正在创建的 SQL,那么其中的语法和正确性,或者它可能返回的长度,显然是无关紧要的。你没有对你的p_sql_o OUT参数做任何事情,所以这也不会导致这个问题。这只是真正str_sql的罪魁祸首,正如贾斯汀昨天暗示的那样,它在函数中被声明为足够大,并且函数本身可以编译 - 所以看起来它必须是如何被调用的,这就是问题所在。

你提到如果你删除'inventory'它会起作用,这会将字符串的长度从201个字符减少到192个字符,所以我猜你已经在调用者中将此设置为200个字符,例如:

declare
    str_sql varchar2(200);
    p_sql_o varchar2(4000);
begin
    str_sql := get(p_sql_o);
end;
/

declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 5

请注意,此报告的行号是5,而不是6您的;这是调用者中出现错误的那一行,而不是函数内部发生赋值的那一行。如果我str_sql varchar2(250);在调用者声明中创建它,那么它可以工作(但它也可能4000与函数中的声明相匹配)。

declare
    str_sql varchar2(250);
    p_sql_o varchar2(4000);
begin
    str_sql := get(p_sql_o);
end;
/

PL/SQL procedure successfully completed.

p_sql_o仍然是空的,因为你从未设置它。看起来OUT参数是多余的。也许您打算将 SQL 字符串放入其中,并且已在调用者中声明为足够大;但随后不清楚返回值是什么 - 您可能只想OUT完全删除参数,并确保您将返回值放入的调用者中的变量足够大。

于 2013-02-28T11:15:14.053 回答
0

您是否尝试过仅针对 SP 之外的数据库运行 SQL 脚本?这将有助于确定 sql 语法是否正确以及您是否返回了预期的内容。看起来您希望得到 4000 字节或更小的响应。你确定那是被退回的东西吗?我没有看到 Where 子句。也许您返回的多行超出了您的限制?诚然,我对存储过程不太熟悉,所以我可能会离开。

于 2013-02-27T18:46:54.870 回答
0

在这里,您使用 p_sql_o 作为输出参数,而不是在函数内分配任何值。所以 p_sql_o 将保存它之前在调用此函数行之后的代码中的值。

正如您定义的 str_sql 只能容纳 4000 个字符,如果您的连接字符串超出该限制,它将给出字符串缓冲区太小 ORA-06512错误。

当您连接字符串以创建 select 语句时,请检查您是否正确使用了单引号,或者您根本没有使用它们。如果发生这种情况,那么在执行动态选择语句时,您可能会收到此错误ORA-06502: PL/SQL: numeric or value error:

于 2013-02-27T22:01:06.647 回答