मेरे पास एक क्लब प्रकार का कॉलम है जिसमें जेसन डेटा है। मेरे पास लगभग 100 कुंजियाँ हैं जो प्रत्येक रिकॉर्ड के लिए अद्वितीय हैं। हम उपयोग कर रहे हैं json_value('json_data', 'keyname')। मेरे मामले में मैं इस रिकॉर्ड के लिए वास्तविक नहीं जानता। तो मुझे एक और टेबल से जुड़ने की जरूरत है जहां चाबियाँ परिभाषित की गई हैं। मुख्य नाम के स्थान पर मैं कॉलमनाम पास करना चाहता हूं। यह कहने में कुछ त्रुटि दे रहा है:

सिंटैक्स त्रुटि,
उम्मीद: स्ट्रिंग

तो क्या कोई सुझाव दे सकता है कि रनटाइम में एक गतिशील कुंजी पास करके जेसन कॉलम से डेटा कैसे प्राप्त किया जाए।

मान लें कि मेरे पास दो टेबल टेबल_1 और टेबल_2 हैं। Table_1 में json_data_column नामक कॉलम होता है जो डेटा को json फॉर्मेट में स्टोर करता है। Table_1 में FK से TABLE_2 है जिसमें मैपिंग कुंजी है। इसलिए हमें यह पता लगाना होगा कि प्रत्येक रिकॉर्ड की उस गतिशील कुंजी का मूल्य क्या है।

अगर मैं t2.json_key के स्थान पर कोई स्थिर स्ट्रिंग दे रहा हूं, तो यह काम कर रहा है। लेकिन गतिशील मान देते समय, यह काम नहीं कर रहा है।

काम में हो

select
       json_value ( json_value (t1.json_data_column, '$.string'), '$.my_key' )
from TABLE_1 t1
       inner join TABLE_2 t2 on t1.json_key_fk = t2.id

काम नहीं कर

select
       json_value ( json_value (t1.json_data_column, '$.string'), t2.json_key )
from TABLE_1 t1
       inner join TABLE_2 t2 on t1.json_key_fk = t2.id

डेटासेट:

{"string":"{\"id\":133100,\"data_found\":5,\"isActive\":\"true\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"}

{"string":"{\"id\":133100,\"data_found\":5,\"isDelete\":\"true\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"}

{"string":"{\"id\":133100,\"data_found\":5,\"isUnderProgress\":\"false\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"}

{"string":"{\"id\":133100,\"data_found\":5,\"isSentToClient\":\"false\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"}
5
John 17 मार्च 2017, 18:13
क्या आप कुछ उदाहरण डेटा पोस्ट कर सकते हैं? यह हमें आपकी समस्या की कल्पना करने में मदद करेगा
 – 
APC
17 मार्च 2017, 18:21

1 उत्तर

सबसे बढ़िया उत्तर

आप जो करने की कोशिश कर रहे हैं वह सीधे आर्किटेक्चर द्वारा समर्थित नहीं हो सकता है। मूल रूप से हम एक JSON PATH इंजन स्थापित करते हैं जो तालिका में प्रत्येक पंक्ति (संग्रह में दस्तावेज़) को पथ के एक सेट के लिए खोजता है जिसे कथन संकलन समय पर परिभाषित किया गया है। आपके मामले में आप हमसे ऐसे पथ के साथ काम करने की अपेक्षा कर रहे हैं जिसे तब तक ज्ञात नहीं किया जा सकता जब तक कि पंक्ति पुनर्प्राप्त न हो जाए।

12.2 में (जो अब GA है) हम ऐसा करने के लिए PL/SQL JSON सुविधाओं का उपयोग कर सकते हैं।

SQL> set lines 120 pages 0
SQL> with FUNCTION GET_NAME(P_JSON_DOC in VARCHAR2) RETURN VARCHAR2
  2  is
  3  begin
  4    return SUBSTR(P_JSON_DOC,INSTR(P_JSON_DOC,'"',1,5)+1,INSTR(P_JSON_DOC,'"',1,6)-INSTR(P_JSON_DOC,'"',1,5)-1);
  5  end;
  6  FUNCTION GET_KEY_VALUE(P_JSON_DOC VARCHAR2, P_KEY VARCHAR2) RETURN VARCHAR2
  7  is
  8    JO JSON_OBJECT_T;
  9  begin
 10    JO := JSON_OBJECT_T(P_JSON_DOC);
 11    return JO.get_STRING(P_KEY);
 12  end;
 13  MY_TABLE as (
 14    select COLUMN_VALUE JSON_DOC
 15      from TABLE(
 16             XDB$STRING_LIST_T(
 17               '{"string":"{\"id\":133100,\"data_found\":5,\"isActive\":\"true\",\"process\":\"completed\",\"status\"
:\"COMPLETED\"}"}',
 18               '{"string":"{\"id\":133100,\"data_found\":5,\"isDelete\":\"true\",\"process\":\"completed\",\"status\"
:\"COMPLETED\"}"}',
 19               '{"string":"{\"id\":133100,\"data_found\":5,\"isUnderProgress\":\"false\",\"process\":\"completed\",\"
status\":\"COMPLETED\"}"}',
 20               '{"string":"{\"id\":133100,\"data_found\":5,\"isSentToClient\":\"false\",\"process\":\"completed\",\"s
tatus\":\"COMPLETED\"}"}'
 21             )
 22           )
 23  )
 24  select GET_NAME(EMBEDDED_JSON),GET_KEY_VALUE(EMBEDDED_JSON,GET_NAME(EMBEDDED_JSON))
 25    from (
 26           select JSON_VALUE(JSON_DOC,'$.string') EMBEDDED_JSON
 27             from MY_TABLE
 28         )
 29  /
isActive
true

isDelete
true

isUnderProgress
false

isSentToClient
false


SQL>

12.1 में GET_NAME फ़ंक्शन तत्काल तत्काल उपयोग कर सकता है

FUNCTION GET_KEY_VALUE(P_JSON_DOC VARCHAR2, P_KEY VARCHAR2) RETURN VARCHAR2
is
  V_RESULT VARCHAR2(200);
begin
  EXECUTE IMMEDIATE 'select JSON_VALUE(:1,''$.' || P_KEY || ''') from dual' into V_RESULT using P_JSON_DOC;
  return V_RESULT;
end;
3
mark d drake 8 अप्रैल 2017, 06:51
सुधार: Oracle 12.1 में, "GET_KEY_VALUE" फ़ंक्शन (नहीं GET_NAME ) तत्काल तत्काल उपयोग कर सकता है। चूंकि JSON_OBJECT_T उपलब्ध नहीं है। इस उत्तर के लिए धन्यवाद! इससे बहुत मदद मिली क्योंकि हम अभी भी 12.1 पर हैं।
 – 
TooSerious
15 जून 2018, 16:51