如何使用 ora:view 针对另一个模式编写 XQUERY 调用

How to write an XQUERY call with ora:view against another schema

我想在 Oracle SQL Developer 中编写一个 XQUERY 调用,但我一直收到错误。

我已经创建了一个模式 table:

ALTER SYSTEM SET deferred_segment_creation=false;
CREATE USER bookdb IDENTIFIED BY abc123;
GRANT RESOURCE TO bookdb;
GRANT UNLIMITED TABLESPACE TO bookdb;
ALTER SESSION SET CURRENT_SCHEMA=bookdb;
CREATE SEQUENCE book_id_seq START WITH 1 INCREMENT BY 1; 
CREATE TABLE book (
  id INTEGER NOT NULL PRIMARY KEY,
  title VARCHAR2(50) NOT NULL UNIQUE,
  originallanguage VARCHAR2(20) NOT NULL,
  genre VARCHAR2(20)
 );

这是 table 中一行的示例:

INSERT INTO book VALUES (book_id_seq.nextval,'Misty Nights','English','Thriller');

table 位于 SQL 开发人员对象导航器的 "Other Users" 下。

如果我只写 SELECT * FROM BOOKDB.BOOK 就可以了。但是使用 XQUERY 命令和 ora:view 函数对我不起作用。

我想要的 XQUERY 命令 运行 是:

XQUERY
element Result {
for $lang in distinct-values(ora:view("BOOKDB.BOOK")//ORIGINALLANGUAGE/text())
let $sum := for $book in ora:view("BOOKDB.BOOK")//ORIGINALLANGUAGE
            return $book[text() = $lang]
return element Language {attribute name {$lang}, attribute Total {count($sum)}}}

但我收到以下错误:

Error at Command Line : 1 Column : 9
Error report -
SQL Error: ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:

我的查询有问题吗?还是 ora:view 函数?

您正在向 ora:view 传递一个参数,它应该是 table 名称。目前,您正试图通过使用 SQL 点符号 (BOOKDB.BOOK) 告诉它在架构 BOOKDB 中查找名为 BOOK 的 table,但是当您提供该值时,您正在 XML 上下文中工作。如文档中所示,您可以使用该函数的可选第一个参数指定模式:

XQUERY
element Result {
for $lang in distinct-values(ora:view("BOOKDB", "BOOK")//ORIGINALLANGUAGE/text())
let $sum := for $book in ora:view("BOOKDB", "BOOK")//ORIGINALLANGUAGE
            return $book[text() = $lang]
return element Language {attribute name {$lang}, attribute Total {count($sum)}}}

Result Sequence                                                                 
--------------------------------------------------------------------------------
<Result><Language name="English" Total="1"></Language></Result>

(这是基于您添加到问题的 DDL 中未加引号的列名,例如 originallanguage;而不是您最初发布的图像中的 mixed-case 值,这暗示您引用了标识符,例如 "OriginalLanguage"。正如 comments/chat 中所讨论的,这里 BOOKDB 是一个 模式 ,而不是数据库;术语的混合令人困惑,因为有 'DB' 作为架构名称的一部分。)

这只是 XMLTable 调用的客户端包装器,顺便说一句:

select column_value from xmltable('element Result {
for $lang in distinct-values(ora:view("BOOKDB", "BOOK")//ORIGINALLANGUAGE/text())
let $sum := for $book in ora:view("BOOKDB", "BOOK")//ORIGINALLANGUAGE
            return $book[text() = $lang]
return element Language {attribute name {$lang}, attribute Total {count($sum)}}}')

您也可以将其用作 XML查询:

select xmlquery('element Result {
for $lang in distinct-values(ora:view("BOOKDB", "BOOK")//ORIGINALLANGUAGE/text())
let $sum := for $book in ora:view("BOOKDB", "BOOK")//ORIGINALLANGUAGE
            return $book[text() = $lang]
return element Language {attribute name {$lang}, attribute Total {count($sum)}}}'
  returning content)
from dual

此外,ora:view 已弃用;但你可以用 fn:collection:

做同样的事情
XQUERY
element Result {
for $lang in distinct-values(fn:collection("oradb:/BOOKDB/BOOK")//ORIGINALLANGUAGE/text())
let $sum := for $book in fn:collection("oradb:/BOOKDB/BOOK")//ORIGINALLANGUAGE
            return $book[text() = $lang]
return element Language {attribute name {$lang}, attribute Total {count($sum)}}}

Result Sequence                                                                 
--------------------------------------------------------------------------------
<Result><Language name="English" Total="1"></Language></Result>