首页 > 解决方案 > 我无法使用 fn:collection 提取数据

问题描述

我正在使用 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

我有现有的表,例如: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

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

标签: oraclecollectionsqxmlquery

解决方案


例如,您有一张桌子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/*
       ,","
       )
    ' 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


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


推荐阅读