كيفية استخراج البيانات من عمود طويل عقد سلاسل XML
-
06-07-2019 - |
سؤال
وهنا هو مائدتي
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;
/
لا تنتمي إلى StackOverflow