如何从包含XML字符串的LONG列中提取数据

时间:2009-08-01 02:24:03

标签: xml oracle oracle10g extraction ora-00997

这是我的表

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

注1:我不能改变这个表 注2:我正在使用Oracle 10g

以下是XMLDATA的示例

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

我尝试过xmltype()但是它没有使用LONG类型(ORA-00997非法使用LONG类型)。也许我应该将XMLDATA值复制到一个新表并转换为CLOB然后我可以转换为xmltype并使用EXTRACTVALUE()

提取“获得价值”的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

以下是一些应该从任意长度的LONG输出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;
/