Почему представление XML-таблицы оракула не возвращает никаких или ограниченных результатов?

Я пытаюсь устранить неполадки в представлении оракула таблицы со столбцом типа xml. Представление не возвращает никаких строк для этой примерной таблицы, которую я создал для тестирования с 10 000 строк. Я искал похожие проблемы с поиском Google и форумом сообщества оракула, но не нашел решения. SQL для таблицы и заполнения фиктивных данных:

CREATE TABLE SY_XML_Example
(
  SY_XML_Example_ID    NUMBER(20),
  SY_COMMENT       VARCHAR2(100 BYTE),
  SY_Number                   Number(20),
  SY_Date                         Date,
  SY_UPDATES_XML   SYS.XMLTYPE
);
/
Alter table SY_XML_Example add constraint SY_XML_Example_PK Primary Key (SY_XML_Example_ID);
/

Declare
  v_Number_Of_Rows    Number            := 10000; -- 983500;
    v_SY_XML_Example        SY_XML_Example%RowType;
    v_SY_Updates_XML        SY_XML_Example.SY_Updates_XML%Type;
  v_Test_XML_Data           Varchar2(100)           := 'kdjfasldfjld afjsidjf  jfipoajifoj sdf';

Begin

    For curr_Row in 1..v_Number_Of_Rows Loop
        v_SY_XML_Example.SY_XML_Example_ID      := SY_XML_Example_ID_Seq.NextVal;
        v_SY_XML_Example.SY_COMMENT                     := 'Sample comment for test.';
        v_SY_XML_Example.SY_Number                  := 42.34;
        v_SY_XML_Example.SY_Date                        := SysDate;

        SELECT 
        XMLCONCAT (
      XMLELEMENT ("SY_XML_Example",
                  XMLAttributes (v_SY_XML_Example.SY_XML_Example_ID AS"SY_XML_Example_ID",
                                 v_SY_XML_Example.SY_Comment As "SY_COMMENT"),

        XMLForest(v_SY_XML_Example.SY_XML_Example_ID AS "SY_XML_EXAMPLE_ID"),
        XMLForest(v_SY_XML_Example.SY_Comment AS "SY_COMMENT"),
        XMLForest(v_SY_XML_Example.SY_Number as "SY_NUMBER"),
        XMLForest(v_SY_XML_Example.SY_Date AS "SY_DATE"),
                XMLForest(v_Test_XML_Data               AS "TEST_DATA_ELEMENT")

                            )
                            )
        INTO v_SY_Updates_XML
        FROM DUAL;

        v_SY_XML_Example.SY_Updates_XML := v_SY_Updates_XML;

        Insert Into SY_XML_Example 
            ( SY_XML_Example_ID, SY_COMMENT, SY_Updates_XML)
            Values
            ( v_SY_XML_Example.SY_XML_Example_ID, v_SY_XML_Example.SY_COMMENT, v_SY_Updates_XML);

    End Loop;

End;
/

SQL для представления:

CREATE OR REPLACE FORCE VIEW VPAORA.VWH_SY_XML_Example
AS 
Select SY_XML_Example_ID,  x."VPA_ID",x."SY_COMMENT",x."SY_NUMBER",x."SY_DATE"
    From SY_XML_Example,
      XMLTABLE ('//SY_XML_EXAMPLE'
                Passing SY_XML_EXAMPLE.SY_Updates_XML
                Columns VPA_ID Number PATH '@SY_XML_EXAMPLE_ID',
                    SY_COMMENT                           Varchar2(100)          PATH 'SY_COMMENT',
                    SY_NUMBER                            Number(20)                 PATH 'SY_NUMBER',
                    SY_DATE                                  Date                               PATH 'SY_DATE'
                ) x;

Предложения? Спасибо Джо P.S. Кажется, что в Интернете и в книгах доступно гораздо меньше информации об oracle xml. Является ли oracle xml «непопулярным / малоиспользуемым», что я должен полностью рассмотреть другой подход? Я использую xml для создания таблицы для отслеживания истории изменений таблицы, поэтому мне не нужны таблицы истории для охвата структур всех таблиц, которые я хочу отслеживать.


person joek    schedule 20.08.2016    source источник


Ответы (1)


Вы должны точно соответствовать регистру имен элементов и атрибутов. Это не ограничение Oracle, это общее ограничение обработки XML. У вас есть SY_XML_Example в качестве имени вашего элемента, но ваш XPath ищет //SY_XML_EXAMPLE, что не одно и то же. Аналогично отличается регистр атрибута в пути к столбцу.

Итак, это должно работать:

CREATE OR REPLACE FORCE VIEW VPAORA.VWH_SY_XML_Example
AS 
Select SY_XML_Example_ID,  x."VPA_ID",x."SY_COMMENT",x."SY_NUMBER",x."SY_DATE"
    From SY_XML_Example,
      XMLTABLE ('//SY_XML_Example'
                Passing SY_XML_EXAMPLE.SY_Updates_XML
                Columns VPA_ID Number PATH '@SY_XML_Example_ID',
                    SY_COMMENT                           Varchar2(100)          PATH 'SY_COMMENT',
                    SY_NUMBER                            Number(20)                 PATH 'SY_NUMBER',
                    SY_DATE                                  Date                               PATH 'SY_DATE'
                ) x;

Или измените имена элементов/атрибутов на все в верхнем регистре. Придерживаясь текущего именования и добавляя последовательность:

Table SY_XML_EXAMPLE created.

Table SY_XML_EXAMPLE altered.

Sequence SY_XML_EXAMPLE_ID_SEQ created.

PL/SQL procedure successfully completed.

View VWH_SY_XML_EXAMPLE created.

select * from VWH_SY_XML_Example;

    SY_XML_EXAMPLE_ID     VPA_ID SY_COMMENT                                                                                            SY_NUMBER SY_DATE 
--------------------- ---------- ---------------------------------------------------------------------------------------------------- ---------- ---------
                  104        104 Sample comment for test.                                                                                     42 20-AUG-16
                  105        105 Sample comment for test.                                                                                     42 20-AUG-16
                  106        106 Sample comment for test.                                                                                     42 20-AUG-16
                  107        107 Sample comment for test.                                                                                     42 20-AUG-16
                  108        108 Sample comment for test.                                                                                     42 20-AUG-16
                  109        109 Sample comment for test.                                                                                     42 20-AUG-16
...
person Alex Poole    schedule 20.08.2016