Dynamic SQL in PL/SQL: Steven Feuerstein
Dynamic SQL in PL/SQL: Steven Feuerstein
Steven Feuerstein
PL/SQL Evangelist, Quest Software
[email protected]
www.ToadWorld.com/SF
Copyright 2000-2010 Steven Feuerstein - Page 1
How to benefit most from this session
DBMS_SQL
– A large and complex built-in package that made
dynamic SQL possible in Oracle7 and Oracle8.
Native Dynamic SQL
– A new (with Oracle8i), native implementation of
dynamic SQL that does almost all of what
DBMS_SQL can do, but much more easily and
usually more efficiently.
– EXECUTE IMMEDIATE
– OPEN cv FOR 'SELECT ... '
PROCEDURE update_emps (
col_in IN VARCHAR2, empnos_in IN numList) IS
enames NameList;
BEGIN
FORALL indx IN empnos_in.FIRST .. empnos_in.LAST
EXECUTE IMMEDIATE
'UPDATE emp SET ' || col_in || ' = ' || col_in
|| ' * 1.1 WHERE empno = :1
RETURNING ename INTO :2'
USING empnos_in (indx )
RETURNING BULK COLLECT INTO enames; Notice that empnos_in is
... indexed, but enames is not.
END;
emp_cv sys_refcursor;
empnos numlist_t;
enames namelist_t;
l_employees employee_t;
BEGIN
OPEN emp_cv FOR 'SELECT empno, ename FROM emp_' || loc_in;
FETCH emp_cv BULK COLLECT INTO empnos, enames;
CLOSE emp_cv;
PROCEDURE process_lineitem (
What's wrong with line_in IN PLS_INTEGER)
IS
this code? BEGIN
IF line_in = 1
How would you fix THEN
process_line1;
END IF;
it?
IF line_in = 2
THEN
process_line2;
END IF;
...
IF line_in = 22045
THEN
process_line22045;
END IF;
END;
exec_ddl_from_file.sql
Copyright 2000-2008 Steven Feuerstein - Page 27
Describe columns in a query
desccols.pkg
desccols.tst
DBMS_SQL.TO_REFCURSOR
– Cursor handle to cursor variable
– Useful when you need DBMS_SQL to bind and
execute, but easier to fetch through cursor
variable.
DBMS_SQL.TO_CURSOR
– Cursor variable to cursor handle
– Binding is static but SELECT list is dynamic
11g_to_cursorid.sql
11g_to_refcursor.sql
Copyright 2000-2008 Steven Feuerstein - Page 31
Best Practices for Dynamic SQL