XML-Over-HTTP (REST Web Services) From PL/SQL
XML-over-HTTP was the precursor to web services allowing easy access to XML via HTTP GETs and POSTs.
oracle miscconfigurationintermediate
by OracleDba
10 views
XML-over-HTTP was the precursor to web services allowing easy access to XML via HTTP GETs and POSTs.
1234567
CONN / AS SYSDBA
CREATE USER test IDENTIFIED BY test DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
GRANT CONNECT, CREATE TABLE, CREATE PROCEDURE TO test;
CREATE TABLE test.emp AS SELECT * FROM scott.emp;
CREATE TABLE test.dept AS SELECT * FROM scott.dept;123456789101112131415161718192021222324252627282930
CONN / AS SYSDBA
-- Create a Database Access Descriptor
BEGIN
DBMS_EPG.create_dad (
dad_name => 'xml_demo',
path => '/xml_demo/*');
END;
/
BEGIN
DBMS_EPG.authorize_dad (
dad_name => 'xml_demo',
user => 'TEST');
END;
/
SELECT DBMS_XDB.gethttpport FROM dual;
GETHTTPPORT
-----------
8080
SQL>
EXEC DBMS_XDB.sethttpport(8080);
PL/SQL procedure successfully completed.
SQL>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
CONN test/test
CREATE OR REPLACE PACKAGE xml_api AS
PROCEDURE get_emp_1 (p_empno IN emp.empno%TYPE DEFAULT NULL);
PROCEDURE get_emp_2 (p_empno IN emp.empno%TYPE DEFAULT NULL);
PROCEDURE get_emp_3 (p_empno IN emp.empno%TYPE DEFAULT NULL);
PROCEDURE get_emp_4 (p_empno IN emp.empno%TYPE DEFAULT NULL);
END xml_api;
/
SHOW ERRORS
CREATE OR REPLACE PACKAGE BODY xml_api AS
PROCEDURE error_page (p_message IN VARCHAR2);
PROCEDURE get_emp_1 (p_empno IN emp.empno%TYPE DEFAULT NULL) IS
BEGIN
OWA_UTIL.mime_header('text/xml');
HTP.print('<emp_list>');
FOR cur_rec IN (SELECT empno, ename, job FROM emp WHERE p_empno IS NULL OR empno = p_empno) LOOP
HTP.print(
'<emp>'
|| '<empno>' || cur_rec.empno || '</empno>'
|| '<ename>' || DBMS_XMLGEN.convert(cur_rec.ename) || '</ename>'
|| '<job>' || DBMS_XMLGEN.convert(cur_rec.job) || '</job>'
|| '</emp>');
END LOOP;
HTP.print('</emp_list>');
EXCEPTION
WHEN OTHERS THEN
error_page(SQLERRM);
END get_emp_1;
PROCEDURE get_emp_2 (p_empno IN emp.empno%TYPE DEFAULT NULL) IS
BEGIN
OWA_UTIL.mime_header('text/xml');
HTP.print('<emp_list>');
FOR cur_rec IN (SELECT empno, ename, job FROM emp WHERE p_empno IS NULL OR empno = p_empno) LOOP
HTP.print(
'<emp'
|| ' empno="' || cur_rec.empno || '"'
|| ' ename="' || DBMS_XMLGEN.convert(cur_rec.ename) || '"'
|| ' job="' || DBMS_XMLGEN.convert(cur_rec.job) || '"'
|| ' />');
END LOOP;
HTP.print('</emp_list>');
EXCEPTION
WHEN OTHERS THEN
error_page(SQLERRM);
END get_emp_2;
PROCEDURE get_emp_3 (p_empno IN emp.empno%TYPE DEFAULT NULL) IS
l_clob CLOB;
BEGIN
SELECT XMLELEMENT("emp_list",
XMLAGG(
XMLELEMENT("emp",
XMLFOREST(empno AS "empno",
ename AS "ename",
job AS "job"
)
)
)
).getClobVal()
INTO l_clob
FROM emp
WHERE p_empno IS NULL OR empno = p_empno;
OWA_UTIL.mime_header('text/xml');
HTP.print(l_clob);
EXCEPTION
WHEN OTHERS THEN
error_page(SQLERRM);
END get_emp_3;
PROCEDURE get_emp_4 (p_empno IN emp.empno%TYPE DEFAULT NULL) IS
l_clob CLOB;
BEGIN
SELECT XMLELEMENT("emp_list",
XMLAGG(
XMLELEMENT("emp",
XMLATTRIBUTES(empno AS "empno",
ename AS "ename",
job AS "job"
)
)
)
).getClobVal()
INTO l_clob
FROM emp
WHERE p_empno IS NULL OR empno = p_empno;
OWA_UTIL.mime_header('text/xml');
HTP.print(l_clob);
EXCEPTION
WHEN OTHERS THEN
error_page(SQLERRM);
END get_emp_4;
PROCEDURE error_page (p_message IN VARCHAR2) AS
BEGIN
OWA_UTIL.mime_header('text/xml');
HTP.print(
'<rowset>'
|| ' <error>' || DBMS_XMLGEN.convert(p_message) || '</error>'
|| '</rowset>');
END error_page;
END xml_api;
/
SHOW ERRORS
http://test:test@myserver:8080/xml_demo/xml_api.get_emp_1
http://test:test@myserver:8080/xml_demo/xml_api.get_emp_1?p_empno=7369
http://test:test@myserver:8080/xml_demo/xml_api.get_emp_2
http://test:test@myserver:8080/xml_demo/xml_api.get_emp_2?p_empno=7369
http://test:test@myserver:8080/xml_demo/xml_api.get_emp_3
http://test:test@myserver:8080/xml_demo/xml_api.get_emp_3?p_empno=7369
http://test:test@myserver:8080/xml_demo/xml_api.get_emp_4
http://test:test@myserver:8080/xml_demo/xml_api.get_emp_4?p_empno=736912345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
CONN / AS SYSDBA
EXEC DBMS_XDB.setftpport(9021);
PL/SQL procedure successfully completed.
SQL>
SET SERVEROUTPUT ON
DECLARE
l_return BOOLEAN;
ex_delete_failure EXCEPTION;
PRAGMA EXCEPTION_INIT(ex_delete_failure, -31001);
BEGIN
-- Delete the folder if it already exists.
BEGIN
DBMS_XDB.deleteresource('/public/mydocs', DBMS_XDB.DELETE_RECURSIVE);
EXCEPTION
WHEN ex_delete_failure THEN
DBMS_OUTPUT.put_line(SQLERRM);
END;
-- Create the folder.
l_return := DBMS_XDB.createfolder('/public/mydocs');
COMMIT;
END;
/
CONN test/test
CREATE OR REPLACE PROCEDURE semi_static AS
l_return BOOLEAN;
l_clob CLOB;
ex_delete_failure EXCEPTION;
PRAGMA EXCEPTION_INIT(ex_delete_failure, -31001);
BEGIN
-- Generate some XML and place it in a CLOB.
SELECT XMLELEMENT("emp_list",
XMLAGG(
XMLELEMENT("emp",
XMLATTRIBUTES(empno AS "empno",
ename AS "ename",
job AS "job"
)
)
)
).getClobVal()
INTO l_clob
FROM emp;
-- Delete the resource it if is already present.
BEGIN
DBMS_XDB.deleteresource('/public/mydocs/semi_static.xml', DBMS_XDB.DELETE_FORCE);
EXCEPTION
WHEN ex_delete_failure THEN
DBMS_OUTPUT.put_line('Delete of file failed. Probably first time call.');
DBMS_OUTPUT.put_line(SQLERRM);
END;
-- Create the resource using the data in the CLOB.
l_return := DBMS_XDB.createresource('/public/mydocs/semi_static.xml', l_clob);
DBMS_XDB.setACL('/public/mydocs/semi_static.xml',
'/sys/acls/all_owner_acl.xml');
COMMIT;
END semi_static;
/
SHOW ERRORS
SET SERVEROUTPUT ON
EXEC semi_static;
http://test:test@myserver:8080/public/mydocs/semi_static.xml
ftp://test:test@myserver:9021/public/mydocs/semi_static.xml123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
CONN / AS SYSDBA
BEGIN
DBMS_EPG.set_dad_attribute(
dad_name => 'xml_demo',
attr_name => 'path-alias',
attr_value => 'rest-ws');
DBMS_EPG.set_dad_attribute(
dad_name => 'xml_demo',
attr_name => 'path-alias-procedure',
attr_value => 'rest_api.handle_request');
END;
/
CONN test/test
CREATE OR REPLACE PACKAGE rest_api AS?
PROCEDURE get_emps (p_empno IN emp.empno%TYPE DEFAULT NULL);
PROCEDURE get_depts (p_deptno IN dept.deptno%TYPE DEFAULT NULL);
PROCEDURE handle_request(p_path IN VARCHAR2);
END rest_api;
/
SHOW ERRORS
CREATE OR REPLACE PACKAGE BODY rest_api AS
PROCEDURE error_page (p_message IN VARCHAR2);
PROCEDURE get_emps (p_empno IN emp.empno%TYPE DEFAULT NULL) IS
l_clob CLOB;
BEGIN
SELECT XMLELEMENT("emp_list",
XMLAGG(
XMLELEMENT("emp",
XMLATTRIBUTES(empno AS "empno",
ename AS "ename",
job AS "job"
)
)
)
).getClobVal()
INTO l_clob
FROM emp
WHERE p_empno IS NULL OR empno = p_empno;
OWA_UTIL.mime_header('text/xml');
HTP.print(l_clob);
EXCEPTION
WHEN OTHERS THEN
error_page(SQLERRM);
END get_emps;
PROCEDURE get_depts (p_deptno IN dept.deptno%TYPE DEFAULT NULL) IS
l_clob CLOB;
BEGIN
SELECT XMLELEMENT("dept_list",
XMLAGG(
XMLELEMENT("dept",
XMLATTRIBUTES(deptno AS "deptno",
dname AS "dname",
loc AS "loc"
)
)
)
).getClobVal()
INTO l_clob
FROM dept
WHERE p_deptno IS NULL OR deptno = p_deptno;
OWA_UTIL.mime_header('text/xml');
HTP.print(l_clob);
EXCEPTION
WHEN OTHERS THEN
error_page(SQLERRM);
END get_depts;
PROCEDURE handle_request(p_path IN VARCHAR2) IS
l_path_arr apex_application_global.vc_arr2;
l_subject VARCHAR2(32767);
l_id VARCHAR2(32767) := NULL;
BEGIN
l_path_arr := apex_util.string_to_table(p_path || '/', '/');
l_subject := l_path_arr(1);
l_id := l_path_arr(2);
CASE LOWER(l_subject)
WHEN 'emp' THEN
get_emps(p_empno => TO_NUMBER(l_id));
WHEN 'dept' THEN
get_depts(p_deptno => TO_NUMBER(l_id));
ELSE
HTP.Print('Page not found.');
END CASE;
END handle_request;
PROCEDURE error_page (p_message IN VARCHAR2) AS
BEGIN
OWA_UTIL.mime_header('text/xml');
HTP.print(
'<rowset>'
|| ' <error>' || DBMS_XMLGEN.convert(p_message) || '</error>'
|| '</rowset>');
END error_page;
END rest_api;
/
SHOW ERRORS
http://test:test@myserver:8080/xml_demo/rest_api.get_emps
http://test:test@myserver:8080/xml_demo/rest_api.get_emps?p_empno=7900
http://test:test@myserver:8080/xml_demo/rest_api.get_depts
http://test:test@myserver:8080/xml_demo/rest_api.get_depts?p_deptno=10
http://test:test@myserver:8080/xml_demo/rest-ws/emp
http://test:test@myserver:8080/xml_demo/rest-ws/emp/7900
http://test:test@myserver:8080/xml_demo/rest-ws/dept
http://test:test@myserver:8080/xml_demo/rest-ws/dept/10Please to add comments
No comments yet. Be the first to comment!