是的,您不能将JSON_Object_T
实例传递给SODA_Document_T
构造函数。但是,您可以使用JSON_QUERY()
PL/SQL 函数钻入给定路径表达式的 JSON 文档并返回 JSON 类型实例。
例子:
jval := JSON_QUERY(body, '$.id' RETURNING JSON);
上例中,$.id
是路径表达式,返回从根开始json_query()
的字段对应的json值id
$
文档:
https ://docs.oracle.com/en/database/oracle/oracle-database/21/adjsn/function-JSON_QUERY.html
您现在应该能够将此jval
类型的实例传递JSON
给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"}