oracle - 将 JSON_OBJECT_T 传入 SODA_DOCUMENT_T

标签 oracle plsql oracle-autonomous-db oracle-soda

我有一个使用 SODA 包来操作 JSON 数据库的 PL/SQL 处理程序。我想:

  1. 读取有效负载中键 id 的值
  2. 将负载 JSON 写入数据库中的新文档。

要执行第 1 步,处理程序将 :body 解析为 JSON_OBJECT_T 类型,以便我可以访问键 id

但对于第 2 步,如果我在使用 SODA_DOCUMENT_T(b_content=> :body) 构建时再次阅读 body,它只会给出给我一份空白文件。

我也不能直接传入 JSON_OBJECT_T 变量,例如 SODA_DOCUMENT_T(j_content=> jso),因为该函数需要 JSON 类型而不是 JSON_OBJECT_T。我找不到 JSON 类型文档,但在代码示例中看到函数 JSON('{}') 生成一个。

阅读 :body_text 然而给我带来了其他问题 - 因为 JSON() 函数无法处理有效负载中的换行符,而是给出错误。

目前为了解决这个问题,我正在使用以下方法:

SODA_DOCUMENT_T(
  j_content => JSON(jso.to_string())
)

这看起来很愚蠢,因为我在将它转换回 JSON 类型之前再次将其序列化为字符串。是否有正确的方法来读取有效负载的键值,并将其传递到 SODA_DOCUMENT_T?

最佳答案

是的,您不能将 JSON_Object_T 实例传递给 SODA_Document_T 构造函数。但是,您可以使用 JSON_QUERY() PL/SQL 函数在给定路径表达式的情况下钻取 JSON 文档并返回 JSON 类型实例。

示例:

jval := JSON_QUERY(body, '$.id' RETURNING JSON);

上例中,$.id为路径表达式,json_query()返回id起始字段对应的json值根 $

文档: https://docs.oracle.com/en/database/oracle/oracle-database/21/adjsn/function-JSON_QUERY.html

您现在应该能够将 JSON 类型的 jval 实例传递给 SODA_Document_T 构造函数。

是的,我认为您绝对应该避免来回转换。

用法:

SQL> 
CREATE OR REPLACE FUNCTION process_request(body  IN VARCHAR2)
RETURN JSON
IS
  j  JSON;
  d  SODA_Document_T;
BEGIN
  
  j := JSON_QUERY(body, '$.id' RETURNING JSON);
  d := SODA_Document_T(j_Content => j);
  -- n := coll.insert_one(d);
  RETURN j;
END;
 13  /

Function created.

SQL> SELECT process_request('{"id":{"type": "string", "val": "DEADBEEF"}}') FROM dual;

PROCESS_REQUEST('{"ID":{"TYPE":"STRING","VAL":"DEADBEEF"}}')
--------------------------------------------------------------------------------
{"type":"string","val":"DEADBEEF"}

我推荐这种方法。让我知道是否有帮助!

替代解决方案:

顺便说一句,给定一个 DOM,您也可以直接转到 JSON 类型实例,在 JSON_Object_T 类型中使用以下方法:

MEMBER FUNCTION GET_JSON RETURNS JSON
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 KEY                            VARCHAR2                IN

此方法与上面显示的 JSON_Query() 的工作几乎相同:

SQL>
CREATE OR REPLACE FUNCTION process_body(data IN VARCHAR2)
RETURN JSON
AS
  body JSON_Object_T;
  j    JSON;
BEGIN
  body := JSON_Object_T.parse(data);
  j := body.get_Json('id');
  return j;
END;
 11  /

SQL> SELECT process_body('{"id":{"type": "string", "val": "DEADBEEF"}}') FROM dual;

PROCESS_BODY('{"ID":{"TYPE":"STRING","VAL":"DEADBEEF"}}')
--------------------------------------------------------------------------------
{"type":"string","val":"DEADBEEF"}

关于oracle - 将 JSON_OBJECT_T 传入 SODA_DOCUMENT_T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70456639/

相关文章:

java - MyBatis 插入列表值

java - 如何在 Oracle AQ 中停止在未经确认的情况下删除消息?

sql - 使用一张小表的值更新一张大表的性能

python - cx_Oracle 如何将复合/复杂数组传递给 PLSQL 过程?

mysql - 使用 MySql 中的对象

database - 如何在 IF 语句中替换 SELECT 语句以使其工作

oracle - 如何使用 Oracle 自治数据库比较两个对象存储存储桶中的文件?

php - 将 BLOB 插入 Oracle 时出错