PL / SQL:循环中的数值或值错误%s

时间:2013-10-02 08:38:52

标签: sql oracle plsql

我在循环中有一个循环的函数,我得到'数值或值错误'。

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>';      

我没有收到任何错误。

问题是什么?


SOLUTION:

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

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

2 个答案:

答案 0 :(得分:0)

使用引用运算符,如

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

逃避报价。查看错误是否仍然存在

答案 1 :(得分:0)

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

请尝试以下操作将文字附加到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>'));