Как написать вызов XQUERY с помощью ora: view для другой схемы - PullRequest
0 голосов
/ 09 мая 2019

Я хочу написать вызов XQUERY в Oracle SQL Developer, но получаю сообщение об ошибке.

Я создал схему и таблицу:

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)
 );

Вот пример строки в таблице:

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

Таблица находится в разделе «Другие пользователи» в навигаторе объектов SQL Developer.

Если я просто напишу 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 функция?

1 Ответ

1 голос
/ 09 мая 2019

Вы передаете один аргумент ora:view, который должен быть именем таблицы.В данный момент вы пытаетесь настроить поиск таблицы с именем BOOK в схеме BOOKDB с помощью точечной нотации SQL (BOOKDB.BOOK), но при работе с этим значением вы работаете в контексте 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>

(Это основано на именах столбцов в кавычках без кавычек, которые вы добавили в вопрос, например, originallanguage; не смешанное значение в изображении, которое вы первоначально разместили, что подразумевало, что вы указали идентификаторы, например "OriginalLanguage". И, как обсуждалось в комментариях / чате, здесь 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)}}}')

что вы также можете сделать как XMLQuery:

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>
...