Syntax
Keyword and parameter description
Bind_argument
This can be an expression whose value is passed to the dynamic SQL statement or PL/SQL block, or it can be a variable that stores a value returned by the dynamic SQL statement or PL/SQL block.
Define_variable_name
This identifies a variable that stores a selected column value.
Dynamic_string
This is a string literal, variable, or expression that represents a SQL statement or PL/SQL block.
Into...
Used only for single-row queries, this clause specifies the variables or record into which column values are retrieved. for each value retrieved by the query, there must be a corresponding, type-compatible variable or field inINTO
Clause.
Record_name
This identifies a user-defined or%ROWTYPE
Record that stores a selected row.
Returning...
Used only for DML statements that haveRETURNING
Clause (withoutBULK
COLLECT
Clause), this clause specifies the bind variables into which column values are returned. For each value returned by the DML statement, there must be a corresponding, type-compatible variable inRETURNING
INTO
Clause.
Using...
This clause specifies a list of input and/or output bind arguments. If you do not specify a parameter mode, it defaultsIN
.
Examples
The following PL/SQL block contains several examples of dynamic SQL:
DECLARE sql_stmt VARCHAR2(200); plsql_block VARCHAR2(500); emp_id NUMBER(4) := 7566; salary NUMBER(7,2); dept_id NUMBER(2) := 50; dept_name VARCHAR2(14) := 'PERSONNEL'; location VARCHAR2(13) := 'DALLAS'; emp_rec emp%ROWTYPE;BEGIN EXECUTE IMMEDIATE 'CREATE TABLE bonus (id NUMBER, amt NUMBER)'; sql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)'; EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location; sql_stmt := 'SELECT * FROM emp WHERE empno = :id'; EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id; plsql_block := 'BEGIN emp_pkg.raise_salary(:id, :amt); END;'; EXECUTE IMMEDIATE plsql_block USING 7788, 500; sql_stmt := 'UPDATE emp SET sal = 2000 WHERE empno = :1 RETURNING sal INTO :2'; EXECUTE IMMEDIATE sql_stmt USING emp_id RETURNING INTO salary; EXECUTE IMMEDIATE 'DELETE FROM dept WHERE deptno = :num' USING dept_id; EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE TRUE';END;