从另一个过程调用过程时出现ORA-06502错误,直接工作正常

问题描述 投票:0回答:1

背景

我正在调试旧版 Oracle 程序的问题,该程序转换 GHS 信息,如下所示:

H315;H319;H317;H360Fd;H335;H373;H410;EUH211;P201;P260;P273;P280;P333+P313;P337+P313;PROF USE

进入与这些代码匹配的实际文本,以逗号和空格分隔,例如:

Causes skin irritation, Causes serious eye irritation, ...

它可用于通用模式,比方说:

COMMON.GetGHSInformation()

它通过构建输出文本(是输出变量)来完成这一切:

P_OUTPUTTEXT := trim(P_OUTPUTTEXT) || ', ' || trim(V_TEXT);

其中

V_TEXT
包含下一个 GHS 文本,例如
Causes serious eye irritation

什么有效

如果直接调用过程

COMMON.GetGHSInformation()
,一切都会按您的预期进行。

什么不起作用

GetGHSInformation()
方法的目标是在其他过程中使用它,甚至可能源自不同的模式。

我还有另一个程序,让我们说吧

OtherSchema.DoSomethingGHSRelated()

这叫

COMMON.GetGHSInformation()

构建

P_OUTPUTTEXT
变量时,逻辑会抛出 ORA-06502 PL/SQL 错误

声明

受影响的变量定义如下:

P_OUTPUTTEXT IN OUT VARCHAR2

V_TEXT     VARCHAR2(2000);

问题

COMMON.GetGHSInformation()
定义的逻辑如果直接调用就可以正常工作,为什么从另一个上下文调用它会失败?

sql oracle plsql plsqldeveloper
1个回答
0
投票

如果你有最小的例子:

DECLARE
  value VARCHAR2(10);
BEGIN
  value := '12345';
  value := value || '678901';
END;
/

那么输出是:

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

这是因为我们定义了一个最多可以包含 10 个字符的字符串(您的问题中为 2000),并且我们尝试将其设置为包含 11 个字符的值。


如果

V_TEXT
定义为
VARCHAR2(2000)
那么当您达到超过 2000 个字符时,您将收到
ORA-06502
错误。

要解决这个问题,可以:

  • 增加
    V_TEXT
    的大小(并确保你的字符串不会超过新的限制);
  • V_TEXT
    更改为
    CLOB
    ;或
  • 限制程序最多只能将 2000 个字符放入
    V_TEXT

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.