为什么 oracle XML table 的视图没有 return 任何或有限的结果?
Why does view of oracle XML table not return any or limited results?
我正在尝试对具有 xml 类型列的 table 的 oracle 视图进行故障排除。对于我为测试 10,000 行而创建的此示例 table,该视图未返回任何行。我用 google 搜索和 oracle 社区论坛寻找过类似问题,但没有找到解决方案。
table 和填充虚拟数据的 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 "unpopular/low use" 我应该考虑完全不同的方法吗?我正在使用 xml 创建一个 table 来跟踪 table 更改历史,因此我不需要历史 table 来覆盖所有 table 的结构我要追踪。
您必须完全匹配元素和属性名称的大小写。这不是 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;
或将 element/attribute 名称更改为全大写。坚持您当前的命名并添加序列:
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
...
我正在尝试对具有 xml 类型列的 table 的 oracle 视图进行故障排除。对于我为测试 10,000 行而创建的此示例 table,该视图未返回任何行。我用 google 搜索和 oracle 社区论坛寻找过类似问题,但没有找到解决方案。 table 和填充虚拟数据的 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 "unpopular/low use" 我应该考虑完全不同的方法吗?我正在使用 xml 创建一个 table 来跟踪 table 更改历史,因此我不需要历史 table 来覆盖所有 table 的结构我要追踪。
您必须完全匹配元素和属性名称的大小写。这不是 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;
或将 element/attribute 名称更改为全大写。坚持您当前的命名并添加序列:
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
...