我无法使用 fn:collection 提取数据

问题描述

我使用的是 Oracle Database 12c 企业版 12.1.0.2.0 版 - 64 位生产

我有现有的表,例如:my_scheme.my_existing_table 我可以选择并查看此表中的数据。

但是当我尝试使用 XMLQuery 从该表中读取数据时:

SELECT XMLQuery(
 'for $i in fn:collection("oradb:/my_scheme/my_existing_table")/content/text()
 return $i'
 returning content
)FROM DUAL;

Oracle 生成错误

ORA-00942: table or view does not exist

也许有人缺少某些权利。请告诉我如何解决这个问题。

解决方法

例如,您有一个表 T

SQL> create table t as select level a,'b' b from dual connect by level<=10;

Table created.

SQL> select * from t;

         A B
---------- -
         1 b
         2 b
         3 b
         4 b
         5 b
         6 b
         7 b
         8 b
         9 b
        10 b

10 rows selected.

您的查询应该是这样的:


SELECT XMLQuery(
 'for $i in fn:collection("oradb:/XTENDER/T")/ROW/A/text()
 return $i'
 returning content
) as res
FROM DUAL;

RES
----------------------------
12345678910

fn:collection() 参数应该是 "oradb:/SCHEMA/TABNAME",然后你应该指定 /ROW/COLNAME,其中 /ROW 列名是强制性的。

事实上,如果这真的是你想要的,你就不需要for

SELECT XMLQuery('fn:collection("oradb:/XTENDER/T")/ROW/A/text()' returning content) res FROM DUAL;

虽然我会将这些值与 , 连接起来,如下所示:

SELECT
   XMLQuery('
     fn:string-join(
       fn:collection("oradb:/XTENDER/T")/ROW/A/text(),","
       )
    ' returning content) as res 
FROM DUAL;

RES
--------------------------------------------------
1,2,3,4,5,6,7,8,9,10

或者来自 T 的所有列的几个变体:

SELECT
   XMLQuery('
     fn:string-join(
       fn:collection("oradb:/XTENDER/T")/ROW/*,b,10,b


SELECT
   XMLQuery('
     fn:string-join(
       for $i in fn:collection("oradb:/XTENDER/T")/ROW return string-join($i/*,"),"; "
       )
    ' returning content) as res 
FROM DUAL;

RES
--------------------------------------------------
1,b; 2,b; 3,b; 4,b; 5,b; 6,b; 7,b; 8,b; 9,b; 10,b