【问题标题】:Why does view of oracle XML table not return any or limited results?为什么 oracle XML 表的视图不返回任何或有限的结果?
【发布时间】:2016-08-20 23:56:45
【问题描述】:

我正在尝试对带有 xml 类型列的表的 oracle 视图进行故障排除。该视图没有返回我为测试 10,000 行而创建的示例表的任何行。我在 google 搜索和 oracle 社区论坛上寻找过类似的问题,但没有找到解决方案。 表和填充虚拟数据的 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;

建议? 谢谢 乔 附:似乎网上和书中关于 oracle xml 的信息要少得多。 oracle xml“不受欢迎/使用率低”我应该完全考虑一种不同的方法吗?我正在使用 xml 创建一个用于跟踪表更改历史记录的表,因此我不需要历史记录表来涵盖我要跟踪的所有表的结构。

【问题讨论】:

    标签: xml oracle xmltable


    【解决方案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
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2019-07-29
      • 2011-11-07
      相关资源
      最近更新 更多