Как использовать предложение WHERE с Oracle JSON_OBJECT?

#sql #oracle #plsql #oracle19c

Вопрос:

Я пытаюсь создать несколько снимков записей oracle с помощью JSON_OBJECT, но, как ни странно, кажется, что я не могу использовать переменную в операторе предложения?

 CREATE TABLE SAMPLE(
  person_id NUMBER,
  first_name VARCHAR2(50) NOT NULL,
  last_name VARCHAR2(50) NOT NULL,
  PRIMARY KEY(person_id)
);

INSERT INTO SAMPLE (person_id, first_name, last_name)
  VALUES (1, 'John', 'Doe');
INSERT INTO SAMPLE (person_id, first_name, last_name)
  VALUES (2, 'Mary', 'Doe');

SET SERVEROUTPUT ON
DECLARE
  name VARCHAR2(50) := 'John';   
  jsonResult CLOB;
BEGIN
  SELECT JSON_OBJECT(*)
  INTO jsonResult
  FROM SAMPLE
  WHERE first_name = name;
  DBMS_OUTPUT.PUT_LINE( jsonResult );
END;
 

Отчет об ошибке:
ORA-00904: «ИМЯ»: неверный идентификатор
ORA-06512: в строке 5

Комментарии:

1. надеюсь, новый пример вам понравится

2. Какую версию базы данных вы используете? Похоже, что JSON_OBJECT(*) это было введено в Oracle 19 , поэтому, если вы используете предыдущую версию, вам придется перечислить все ключи.

3. Oracle Database 19c Enterprise Edition Выпуск 19.0.0.0.0 — Производство

4. Похоже, это ошибка. Запрос работает, если вы используете текстовый литерал, но не с переменной PL/SQL. Попытка WHERE first_name = (SELECT name FROM DUAL); дает внутреннюю ошибку.

Ответ №1:

На данный момент я нашел один, печальный, обходной путь… замена подстановочного знака «*» для списка столбцов.

Это работает:

 -- WORKs!
SET SERVEROUTPUT ON
DECLARE 
   name VARCHAR2(50) := 'John';
   jsonResult CLOB;
BEGIN
    SELECT JSON_OBJECT(person_id, first_name, last_name ) INTO jsonResult FROM SAMPLE WHERE first_name = name;
    DBMS_OUTPUT.PUT_LINE( jsonResult );
END;