PL/SQL-to-SQL Interface Enhancements for PL/SQL-Only Data Types in Oracle Database 12c Release 1 (12.1)
Oracle 12c now supports the binding of additional PL/SQL-only data types to SQL.
oracle 12cconfigurationintermediate
by OracleDba
13 views
Oracle 12c now supports the binding of additional PL/SQL-only data types to SQL.
1234567891011121314151617181920212223242526272829303132333435363738394041424344
CREATE OR REPLACE FUNCTION boolean_test (p_boolean IN BOOLEAN)
RETURN VARCHAR2 AUTHID DEFINER AS
BEGIN
IF p_boolean THEN
RETURN 'TRUE';
ELSE
RETURN 'FALSE';
END IF;
END;
/
SET SERVEROUTPUT ON
DECLARE
l_sql VARCHAR2(32767);
l_boolean BOOLEAN := TRUE;
l_result VARCHAR2(10);
BEGIN
l_sql := 'SELECT boolean_test(:l_boolean) INTO :l_result FROM dual';
EXECUTE IMMEDIATE l_sql INTO l_result USING l_boolean;
DBMS_OUTPUT.put_line('l_result=' || l_result);
END;
/
l_result=TRUE
PL/SQL procedure successfully completed.
SQL>
DECLARE
l_sql VARCHAR2(32767);
l_result VARCHAR2(10);
BEGIN
l_sql := 'SELECT boolean_test(TRUE) INTO :l_result FROM dual';
EXECUTE IMMEDIATE l_sql INTO l_result;
DBMS_OUTPUT.put_line('l_result=' || l_result);
END;
/
*
ERROR at line 1:
ORA-00904: "TRUE": invalid identifier
ORA-06512: at line 6
SQL>123456789101112131415161718192021222324252627282930313233343536373839
CREATE OR REPLACE PACKAGE test_pkg AUTHID DEFINER AS
TYPE rec_type IS RECORD (id NUMBER, description VARCHAR2(50));
PROCEDURE record_test (p_rec OUT rec_type);
END;
/
CREATE OR REPLACE PACKAGE BODY test_pkg AS
PROCEDURE record_test (p_rec OUT rec_type) AS
BEGIN
p_rec.id := 1;
p_rec.description := 'ONE';
END;
END;
/
SET SERVEROUTPUT ON
DECLARE
l_sql VARCHAR2(32767);
l_record test_pkg.rec_type;
BEGIN
l_sql := 'BEGIN test_pkg.record_test(:l_record); END;';
EXECUTE IMMEDIATE l_sql USING OUT l_record;
DBMS_OUTPUT.PUT_LINE('l_record.id = ' || l_record.id);
DBMS_OUTPUT.PUT_LINE('l_record.description = ' || l_record.description);
END;
/
l_record.id = 1
l_record.description = ONE
PL/SQL procedure successfully completed.
SQL>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
CREATE OR REPLACE PACKAGE test_pkg AUTHID DEFINER AS
TYPE collection_type IS TABLE OF VARCHAR2(10)
INDEX BY PLS_INTEGER;
FUNCTION display_collection_contents (p_collection IN collection_type)
RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY test_pkg AS
FUNCTION display_collection_contents (p_collection IN collection_type)
RETURN NUMBER IS
BEGIN
FOR i IN p_collection.FIRST .. p_collection.LAST LOOP
DBMS_OUTPUT.put_line(i || ' : ' || p_collection(i));
END LOOP;
RETURN p_collection.COUNT;
END;
END;
/
SET SERVEROUTPUT ON
DECLARE
l_sql VARCHAR2(32767);
l_collection test_pkg.collection_type;
l_result NUMBER;
BEGIN
l_collection(1) := 'ONE';
l_collection(2) := 'TWO';
l_collection(3) := 'THREE';
l_sql := 'SELECT test_pkg.display_collection_contents(:l_collection) INTO :l_result FROM dual';
EXECUTE IMMEDIATE l_sql INTO l_result USING l_collection;
DBMS_OUTPUT.put_line('l_result=' || l_result);
END;
/
1 : ONE
2 : TWO
3 : THREE
l_result=3
PL/SQL procedure successfully completed.
SQL>
CREATE OR REPLACE PACKAGE test_pkg AUTHID DEFINER AS
TYPE collection_type IS TABLE OF VARCHAR2(10);
FUNCTION display_collection_contents (p_collection IN collection_type)
RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY test_pkg AS
FUNCTION display_collection_contents (p_collection IN collection_type)
RETURN NUMBER IS
BEGIN
FOR i IN p_collection.FIRST .. p_collection.LAST LOOP
DBMS_OUTPUT.put_line(i || ' : ' || p_collection(i));
END LOOP;
RETURN p_collection.COUNT;
END;
END;
/
SET SERVEROUTPUT ON
DECLARE
l_sql VARCHAR2(32767);
l_collection test_pkg.collection_type;
l_result NUMBER;
BEGIN
l_collection := test_pkg.collection_type('ONE', 'TWO', 'THREE');
l_sql := 'SELECT test_pkg.display_collection_contents(:l_collection) INTO :l_result FROM dual';
EXECUTE IMMEDIATE l_sql INTO l_result USING l_collection;
DBMS_OUTPUT.put_line('l_result=' || l_result);
END;
/
1 : ONE
2 : TWO
3 : THREE
l_result=3
PL/SQL procedure successfully completed.
SQL>
CREATE OR REPLACE PACKAGE test_pkg AUTHID DEFINER AS
TYPE collection_type IS VARRAY(10) OF VARCHAR2(10);
FUNCTION display_collection_contents (p_collection IN collection_type)
RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY test_pkg AS
FUNCTION display_collection_contents (p_collection IN collection_type)
RETURN NUMBER IS
BEGIN
FOR i IN p_collection.FIRST .. p_collection.LAST LOOP
DBMS_OUTPUT.put_line(i || ' : ' || p_collection(i));
END LOOP;
RETURN p_collection.COUNT;
END;
END;
/
SET SERVEROUTPUT ON
DECLARE
l_sql VARCHAR2(32767);
l_collection test_pkg.collection_type;
l_result NUMBER;
BEGIN
l_collection := test_pkg.collection_type('ONE', 'TWO', 'THREE');
l_sql := 'SELECT test_pkg.display_collection_contents(:l_collection) INTO :l_result FROM dual';
EXECUTE IMMEDIATE l_sql INTO l_result USING l_collection;
DBMS_OUTPUT.put_line('l_result=' || l_result);
END;
/
1 : ONE
2 : TWO
3 : THREE
l_result=3
PL/SQL procedure successfully completed.
SQL>1234567891011121314151617181920212223242526272829303132333435363738394041
CREATE OR REPLACE PACKAGE test_pkg AUTHID DEFINER AS
TYPE collection_type IS TABLE OF VARCHAR2(10);
FUNCTION display_collection_contents (p_collection IN collection_type)
RETURN collection_type PIPELINED;
END;
/
CREATE OR REPLACE PACKAGE BODY test_pkg AS
FUNCTION display_collection_contents (p_collection IN collection_type)
RETURN collection_type PIPELINED IS
BEGIN
FOR i IN p_collection.FIRST .. p_collection.LAST LOOP
PIPE ROW (p_collection(i));
END LOOP;
RETURN;
END;
END;
/
SET SERVEROUTPUT ON
DECLARE
l_sql VARCHAR2(32767);
l_collection test_pkg.collection_type;
l_result NUMBER;
BEGIN
l_collection := test_pkg.collection_type('ONE', 'TWO', 'THREE');
l_sql := 'SELECT COUNT(*) INTO :l_result FROM TABLE(test_pkg.display_collection_contents(:l_collection))';
EXECUTE IMMEDIATE l_sql INTO l_result USING l_collection;
DBMS_OUTPUT.put_line('l_result=' || l_result);
END;
/
l_result=3
PL/SQL procedure successfully completed.
SQL>Please to add comments
No comments yet. Be the first to comment!