EXECUTE IMMEDIATE Statement. Oracle Release 2 (9.2)
Reklama
Reklama
EXECUTE IMMEDIATE Statement
EXECUTE IMMEDIATE Statement
The
EXECUTE IMMEDIATE
statement prepares (parses) and immediately executes a dynamic SQL statement or anonymous PL/SQL block. For more information, see
Syntax execute_immediate_statement
EXECUTE IMMEDIATE dynamic_string
INTO
, define_variable record_name
,
IN
OUT
IN OUT
USING
RETURNING
RETURN
INTO bind_argument
, bind_argument
;
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.
PL/SQL Language Elements
13-67
EXECUTE IMMEDIATE Statement
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 in the
INTO
clause.
record_name
This identifies a user-defined or
%ROWTYPE
record that stores a selected row.
RETURNING INTO ...
Used only for DML statements that have a
RETURNING
clause (without a
BULK
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 in the
RETURNING INTO
clause.
USING ...
This clause specifies a list of input and/or output bind arguments. If you do not specify a parameter mode, it defaults to
IN
.
Usage Notes
Except for multi-row queries, the dynamic string can contain any SQL statement
(without the terminator) or any PL/SQL block (with the terminator). The string can also contain placeholders for bind arguments. However, you cannot use bind arguments to pass the names of schema objects to a dynamic SQL statement.
You can place all bind arguments in the
USING
clause. The default parameter mode is
IN
. For DML statements that have a
RETURNING
clause, you can place
OUT arguments in the
RETURNING INTO
clause without specifying the parameter mode, which, by definition, is
OUT
. If you use both the
USING
clause and the
RETURNING
INTO
clause, the
USING
clause can contain only
IN
arguments.
13-68
PL/SQL User’s Guide and Reference
EXECUTE IMMEDIATE Statement
Examples
At run time, bind arguments replace corresponding placeholders in the dynamic string. So, every placeholder must be associated with a bind argument in the
USING clause and/or
RETURNING INTO
clause. You can use numeric, character, and string literals as bind arguments, but you cannot use Boolean literals (
TRUE
,
FALSE
, and
NULL
). To pass nulls to the dynamic string, you must use a workaround. See
"Passing Nulls" on page 11-16.
Dynamic SQL supports all the SQL datatypes. So, for example, define variables and bind arguments can be collections,
LOB s, instances of an object type, and refs. As a rule, dynamic SQL does not support PL/SQL-specific types. So, for example, define variables and bind arguments cannot be Booleans or index-by tables. The only exception is that a PL/SQL record can appear in the
INTO
clause.
You can execute a dynamic SQL statement repeatedly using new values for the bind arguments. However, you incur some overhead because
EXECUTE IMMEDIATE re-prepares the dynamic string before every execution.
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;
PL/SQL Language Elements
13-69
EXECUTE IMMEDIATE Statement
EXECUTE IMMEDIATE ’DELETE FROM dept WHERE deptno = :num’
USING dept_id;
EXECUTE IMMEDIATE ’ALTER SESSION SET SQL_TRACE TRUE’;
END;
Related Topics
13-70
PL/SQL User’s Guide and Reference
Stáhnout
Reklama