Generating JSON using APEX_JSON
Sample tables from Oracle
Create Two table based on below query and Inserted some record for demo purpose:
CREATE TABLE DEPT (
DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR2(14),
LOC VARCHAR2(13)
) ;
CREATE TABLE EMP (
EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT
);
INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');
INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87','dd-mm-rr')-85,3000,NULL,20);
INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,to_date('13-JUL-87', 'dd-mm-rr')-51,1100,NULL,20);
INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
COMMIT;
Sample block to generated JSON manually
SET SERVEROUTPUT ON
DECLARE
l_deptno dept.deptno%TYPE := 10;
l_dept_row dept%ROWTYPE;
BEGIN
APEX_JSON.initialize_clob_output;
APEX_JSON.open_object; -- {
SELECT d.*
INTO l_dept_row
FROM dept d
WHERE d.deptno = l_deptno;
APEX_JSON.open_object('department'); -- department {
APEX_JSON.write('department_number', l_dept_row.deptno);
APEX_JSON.write('department_name', l_dept_row.dname);
APEX_JSON.open_array('employees'); -- employees: [
FOR cur_rec IN (SELECT * FROM emp e WHERE e.deptno = l_deptno)
LOOP
APEX_JSON.open_object; -- {
APEX_JSON.write('employee_number', cur_rec.empno);
APEX_JSON.write('employee_name', cur_rec.ename);
APEX_JSON.close_object; -- } employee
END LOOP;
APEX_JSON.close_array; -- ] employees
APEX_JSON.close_object; -- } department
APEX_JSON.open_object('metadata'); -- metadata {
APEX_JSON.write('published_date', TO_CHAR(SYSDATE, 'DD-MON-YYYY'));
APEX_JSON.write('publisher', 'oracle-base.com');
APEX_JSON.close_object; -- } metadata
APEX_JSON.close_object; -- }
DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output);
APEX_JSON.free_output;
END;
/
OUTPUT:
{
"department": {
"department_number": 10,
"department_name": "ACCOUNTING",
"employees": [
{
"employee_number": 7782,
"employee_name": "CLARK"
},
{
"employee_number": 7839,
"employee_name": "KING"
},
{
"employee_number": 7934,
"employee_name": "MILLER"
}
]
},
"metadata": {
"published_date": "04-APR-2016",
"publisher": "oracle-base.com"
}
}
References:
https://oracle-base.com/articles/misc/apex_json-package-generate-and-parse-json-documents-in-oracle