如何使用 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>
我想在 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>