【问题标题】:Oracle JSON_OBJECT_T To ClobOracle JSON_OBJECT_T 到 Clob
【发布时间】:2019-05-25 09:50:29
【问题描述】:

我正在创建一个将 JSON CLOB 作为 IN OUT 参数的过程。我的问题是如何将 JSON_OBJECT_T 转换为 CLOB?我希望在 CLOB 中维护 JSON 结构,而不仅仅是存储 json 值(参见下面的 JSON_OBJECT_T.GET_CLOB('firstname'))。

我的示例测试代码:

CREATE TABLE employees
   ( employee_id NUMBER(6)
   , first_name VARCHAR2(20)
   , last_name VARCHAR2(25)
   CONSTRAINT emp_last_name_nn NOT NULL
   , email VARCHAR2(25)
   CONSTRAINT emp_email_nn NOT NULL
   , phone_number VARCHAR2(20)
   , hire_date DATE
   CONSTRAINT emp_hire_date_nn NOT NULL
   , job_id VARCHAR2(10)
   CONSTRAINT emp_job_nn NOT NULL
   , salary NUMBER(8,2)
   , commission_pct NUMBER(2,2)
   , manager_id NUMBER(6)
   , department_id NUMBER(4)
   , CONSTRAINT emp_salary_min
   CHECK (salary > 0) 
   , CONSTRAINT emp_email_uk
   UNIQUE (email)
   ) ;

INSERT INTO EMPLOYEES VALUES (123,'John','Doe','John.Doe@Test.Com',99999999,TRUNC(SYSDATE),234,60000,null,null,null)


--CREATE OR REPLACE PROCEDURE GETEMPLOYEE (P_CLOB IN OUT CLOB) 
--AS
DECLARE
P_CLOB CLOB :=
'{  
   "employee_id":123
}';
V_JSON_IN JSON_OBJECT_T := JSON_OBJECT_T.PARSE(P_CLOB);
V_EMP_ID NUMBER := V_JSON_IN.GET_NUMBER('employee_id');
V_EMP_REC EMPLOYEES%ROWTYPE;
V_JSON_OUT JSON_OBJECT_T := NEW JSON_OBJECT_T;


BEGIN
  P_CLOB := EMPTY_CLOB();
  SELECT * INTO V_EMP_REC FROM EMPLOYEES WHERE EMPLOYEE_ID = V_EMP_ID;

  V_JSON_OUT.PUT('firstname',V_EMP_REC.First_Name);
  V_JSON_OUT.PUT('lastname',V_EMP_REC.Last_Name);
  V_JSON_OUT.PUT('salary',V_EMP_REC.Salary);


  P_CLOB := V_JSON_OUT.GET_CLOB('firstname');  
  DBMS_OUTPUT.put_line(TO_CHAR(P_CLOB)); -- JOHN

  ---How to cast V_JSON_OUT to Clob and store in P_CLOB?       
END;

【问题讨论】:

    标签: json oracle plsql oracle12c


    【解决方案1】:

    您正在使用get_clob(),它获取特定的键值。

    您可以使用to_string()to_clob()serialize 整个JSON 对象 单个字符串值:

    序列化是解析函数的逆。序列化操作采用 JSON 数据的内存表示并将其打印为字符串。序列化函数和过程是:

    MEMBER FUNCTION to_String    RETURN VARCHAR2  
    ...  
    MEMBER FUNCTION to_Clob      RETURN CLOB  
    ...
    

    所以对于你的代码:

      P_CLOB := V_JSON_OUT.TO_CLOB;  
      DBMS_OUTPUT.put_line(P_CLOB);
    

    使用该表的 HR 模式版本,它已经有一个 ID 123,打印出来:

    {"firstname":"Shanta","lastname":"Vollman","salary":6500}
    

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 2010-12-04
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      相关资源
      最近更新 更多