1

我有一个在循环内有一个循环的函数,我收到“数字或值错误”。

sendXML CLOB;

 FOR p IN (
      SELECT ID, NAME, GUID FROM products
      WHERE ID = IN_PROJECT_ID
      )
    LOOP

    if p.ID is not null and p.NAME is not null then

     sendXML := sendXML || '<product type="product" id="' || p.ID|| '" name="' || p.NAME || '">';

     FOR t IN (
      SELECT
        identifier ATTR_IDENTIFIER, 
        label ATTR_LABEL, 
      CASE type
        WHEN UPPER('STRING') THEN TRIM(string_value)
        WHEN UPPER('NUMBER') THEN TRIM(TO_CHAR(number_value))
      ELSE '' END ATTR_VALUE
      FROM products_data
      WHERE 
        product_id = p.ID AND
        identifier is not null
      ORDER BY identifier
      )

    LOOP

      sendXML := sendXML || '<attribute identifier="' || t.ATTR_IDENTIFIER || '" label="'|| t.ATTR_LABEL || '">' || t.ATTR_VALUE || '</attribute>';        

    END LOOP;

   END IF;

END LOOP;

错误

ORA-06502: PL/SQL: 数值或数值错误 ORA-06512: 在 "ASM.XXXX", 第 85 行 06502
06502. 00000 - "PL/SQL: 数值或数值错误%s"

为线抛出:

 sendXML := sendXML || '<product type="product" id="' || p.ID|| '" name="' || p.NAME || '">';

但我发现如果我删除最后一个

sendXML := sendXML || '<attribute identifier="' || t.ATTR_IDENTIFIER || '" label="'|| t.ATTR_LABEL || '">' || t.ATTR_VALUE || '</attribute>';      

我没有收到任何错误。

问题出在哪里?


解决方案:

p.ID 是整数,必须是字符... TO_CHAR(p.ID) 解决了我的问题!

sendXML := sendXML || '<product type="product" id="' || TO_CHAR(p.ID) ||
4

2 回答 2

1

我的猜测是字符串变得大于varchar2PL/SQL 中的最大值。

尝试以下操作将文本附加到 clob:

 dbms_lob.append(sendXML, to_clob('<product type="product" id="' || p.ID|| '" name="' || p.NAME || '">'));

第二个:

 dbms_lob.append(sendXML, to_clob('<attribute identifier="' || t.ATTR_IDENTIFIER || '" label="'|| t.ATTR_LABEL || '">' || t.ATTR_VALUE || '</attribute>'));
于 2013-10-02T10:33:39.213 回答
0

使用引号运算符,例如

sendXML := sendXML || q'[<attribute identifier=']' || t.ATTR_IDENTIFIER || q'[' label=']'|| t.ATTR_LABEL || q'['>]' || t.ATTR_VALUE || q'[</attribute>]'; 

转义引号。查看错误是否仍然存在

于 2013-10-02T09:06:27.750 回答