سؤال

وهنا هو مائدتي

MYTABLE(ID NUMBER(10),
        DATATYPE VARCHAR2(2 BYTE),
        XMLDATA LONG
)

وNOTE1: لا أستطيع تغيير هذا الجدول NOTE2: أنا باستخدام أوراكل 10g

وهنا عينة من XMLDATA

<myxml version="1">
  <node1>
   <child1>value to get</child1>
  </node1>
</myxml>

وحاولت xmltype () ولكنه لا يعمل مع نوع طويل (ORA-00997 الاستخدام غير المشروع للنوع طويل). ربما ينبغي لي أن نسخ القيم XMLDATA إلى جدول جديد وتحويله إلى CLOB ثم أنا يمكن أن تتحول إلى xmltype واستخدام <لأ href = "http://www.psoug.org/reference/xml_functions.html" يختلط = "نوفولو noreferrer" > EXTRACTVALUE () ؟

ما هو أفضل وسيلة لاستخراج "القيمة للحصول على"؟

هل كانت مفيدة؟

المحلول

وفيما يلي بعض التعليمات البرمجية التي من المفترض أن إخراج CLOB من طويل من طول التعسفي. ومن مقالب الجسم من MY_TRIGGER إلى dbms_output. اذا كان يعمل يجب أن تكون قادرة على تحليل ذلك حسب الحاجة.

DECLARE
    c_chunk_limit CONSTANT   INTEGER := 100;

    v_cur                    INTEGER := DBMS_SQL.open_cursor;
    v_offset                 INTEGER;
    v_chunk                  VARCHAR2(32767);
    v_chunk_size             INTEGER;
BEGIN
    DBMS_SQL.parse(
        v_cur,
        'SELECT trigger_body FROM dba_triggers WHERE trigger_name = ''MY_TRIGGER''',
        DBMS_SQL.native
    );

    DBMS_SQL.define_column_long(v_cur, 1);  -- 1 here represents the column position in the select list the long is column#1

    IF DBMS_SQL.execute_and_fetch(v_cur) > 0
    THEN
        v_offset   := 0;

        LOOP
            DBMS_SQL.column_value_long(
                v_cur,
                1,  -- 1 here represents the column position in the select list the long is column#1
                c_chunk_limit,
                v_offset,
                v_chunk,
                v_chunk_size
            );

            EXIT WHEN v_chunk_size = 0;

            v_offset   := v_offset + v_chunk_size;
            DBMS_OUTPUT.put_line(v_chunk);
        END LOOP;
    END IF;

    DBMS_SQL.close_cursor(v_cur);
END;
/
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top