2017-05-22 54 views
1

我正在嘗試在Oracle 12c中使用Application Express以編程方式在PL/SQL觸發器中查找JSON數組的長度。這將允許我遍歷每個元素並將數據插入到另一個表中。現在,JSON作爲CLOB存儲在列中,並將其轉換爲VarCHAR2。下面的代碼:在PL/SQL中查找JSON數組的長度觸發器

SQL錯誤消息:ORA-06502:PL/SQL:數字或值錯誤
ORA-06512:

declare 
    json CLOB; 
    json_varchar VARCHAR2(32767); 
    json_member WWV_FLOW_T_VARCHAR2; 
begin 
    json := :new.ORDER_SKU; 
    json_varchar := CAST(json AS VARCHAR2); 
    apex_json.parse (json); 
    json_member := APEX_JSON.get_members(p_path=>'order_sku'); 
    FOR i IN 1..json_member.count 
    LOOP 
    ... 
    END LOOP; 
end; 

運行此觸發時,我收到以下錯誤的「APEX_050100.WWV_FLOW_JSON」,線1597
ORA-06512:在 「TriggerName」,第9行
ORA-04088:觸發器 'TriggerName'
ORA-06512的執行期間的錯誤:在線路6`

我想我應該只是使用不同的方法來查找JSON數組的長度,但我一直沒有找到任何通過文檔或堆棧溢出。

此外,如果它是幫助JSON存儲在以下形式:

{ 
"order_sku":[{"sku1":"details"},{"sku2":"details"}] 
} 
+1

謝謝N Cheadle。它看起來像你在12c。我想知道你是否研究過12cR1引入的json支持?它具有可能感興趣的'json_table'等功能。 https://docs.oracle.com/database/121/ADXDB/json.htm#ADXDB6246 – alexgibbs

+0

JSON_Table做了我打算對觸發器做的感謝評論。 –

回答

1

既然你在12C版本我@alexgibbs同意,你應該看看json_table如果你真的想使用apex_json,你不需要將你的clob轉換成varchar,你可以做類似於

DECLARE 
l_json CLOB := '{"order_sku":[{"sku1":"details"},{"sku2":"details"}] }'; 
j apex_json.t_values; 
l_path VARCHAR2(100); 

BEGIN 
apex_json.parse(j, l_json); 

FOR i IN 1..apex_json.get_count(p_values => j, p_path => 'order_sku') 
LOOP 
    -- if your sku tag could be always the same "sku" you would not need the following line 
    l_path := 'order_sku[%d].' || apex_json.get_members(p_values => j, p_path => 'order_sku[%d]', p0 => i)(1); 

    -- replace with the insert you want to do 
    dbms_output.put_line(apex_json.get_varchar2(p_values => j, p_path => l_path, p0 => i)); 

END LOOP; 

END; 
+0

我認爲你是對的,我在JSON表格中查看更多細節,我認爲它會比嘗試自己手動插入數據更清潔。讓我做更多的關於使用json_table創建視圖的深入探討,如果它能夠工作,我會將您的解決方案標記爲答案。 –

+0

JSON表完全正是我需要創建一個視圖使用該功能做了我正在尋找。 –