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