在 PL/SQL 中,我可以從有效負載中讀取并獲取 JSON_ARRAY_T 物件。假設我想查詢由他們的ids標識的檔案串列。有效載荷中發送的 JSON 是:
{"id": [1, 2, 3]}
我的 PL/SQL 就像
DECLARE
payload JSON_OBJECT_T;
idArray JSON_ARRAY_T;
cur SYS_REFCURSOR;
BEGIN
payload := JSON_OBJECT_T.parse(:body_text);
idArray := payload.get_Array('id');
OPEN cur FOR
SELECT * FROM INVOICES WHERE id IN idArray;
:result := cur;
END;
我遇到一個錯誤但是說ORA-00932: inconsistent datatypes: expected NUMBER got SYS.JSON_ARRAY_T。我應該如何讓這個作業?
uj5u.com熱心網友回復:
這里的問題是“in”子句在其右側需要一個串列,但無法處理 json_array_t 實體。
一種選擇是將陣列展開為數字。為了做到這一點,“in”子句的右側引數將是 json_table 的結果,它使輸入陣列展開。
drop table invoices;
create table invoices (id number);
insert into invoices values (2);
insert into invoices values (4);
select * from invoices where id in
(select * from json_table('{"id":[1,2,3]}', '$.id[*]' columns (a path '$')));
另一種選擇是將 json_array 轉換為可變陣列/嵌套表,并在“in”子句的右側展開該表。與上面相同,但需要將可變陣列/嵌套表作為中間步驟。
drop table invoices;
create table invoices (id number);
insert into invoices values (2);
insert into invoices values (4);
drop type narr;
create type narr as array(5) of number;
/
select * from invoices where id in
(select * from table
(select json_value('{"id":[1,2,3]}', '$.id' returning narr)));
也就是說,如果您想繼續使用 json_array_t,那么您可能需要像這樣迭代 json_array_t 的元素:
DECLARE
payload JSON_OBJECT_T;
idArray JSON_ARRAY_T;
idx number;
BEGIN
payload := JSON_OBJECT_T.parse('{"id":[1,2,3]}');
idArray := payload.get_Array('id');
for idx in 1..idArray.get_Size loop
dbms_output.put_line(idArray.get(idx-1).to_Number());
end loop;
END;
/
uj5u.com熱心網友回復:
使用JSON_TABLE以下SQL 在 SQL 中完成所有操作:
BEGIN
OPEN :result FOR
SELECT i.*
FROM INVOICES i
INNER JOIN JSON_TABLE(
:body_text,
'$.id[*]'
ERROR ON ERROR
COLUMNS (
id NUMBER PATH '$'
)
) j
ON (i.id = j.id);
END;
/
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/408199.html
標籤:
