背景
我正在调试旧版 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()
定义的逻辑如果直接调用就可以正常工作,为什么从另一个上下文调用它会失败?
如果你有最小的例子:
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
;或V_TEXT
。