【问题标题】:How to use a WHERE clause with Oracle JSON_OBJECT?如何在 Oracle JSON_OBJECT 中使用 WHERE 子句?
【发布时间】:2021-08-16 03:45:57
【问题描述】:

我正在尝试使用 JSON_OBJECT 生成一些 oracle 记录快照,但令人惊讶的是,我似乎无法在子句语句中使用变量?

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 行

【问题讨论】:

  • 希望新的例子是你喜欢的
  • 您使用的是什么数据库版本? JSON_OBJECT(*) 似乎是在 Oracle 19 中引入的,因此如果您使用的是 version prior to that,则必须列出每个键。
  • Oracle Database 19c 企业版版本 19.0.0.0.0 - 生产
  • 这看起来是一个错误。如果您使用文本文字但不使用 PL/SQL 变量,则该查询有效。尝试WHERE first_name = (SELECT name FROM DUAL); 会出现内部错误。

标签: sql oracle plsql oracle19c


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-22
    • 2018-06-10
    • 1970-01-01
    • 2011-10-08
    • 2017-12-21
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多