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

そして2番目のもの:

 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 に答える