文章目录
前言
程序运行时才能确定的SQL语句如SQL语句所使用的表和数据列也不是预先知道的或者用户所需的数据排序和分组方式,以构建各种报告…,由于SQL语句是动态产生的,所以被称为动态的。
一、EXECUTE IMMEDIATE
动态SQL语句:
‘SELECT first_name, last_name FROM stu WHERE stuid = :stu_id’
无法预先知道需要查询学生ID的值,需要使用绑定参数 :stu_id来实现指定。绑定参数是未声明标识符的占位符,名称的前缀是冒号。PL/SQL不会区分如下两个语句
‘SELECT first_name, last_name FROM stu WHERE stuid = :stu_id’
‘SELECT first_name, last_name FROM stu WHERE stuid = :id’
为处理动态SQL语句,需要使用EXECUTE IMMEDIATE,或者OPEN-FOR、FETCH和CLOSE语句。EXECUTE IMMEDIATE被用于单行SELECT语句、所有的DML语句和DDL语句。OPEN-FOR、FETCH和CLOSE语句用于多行SELECT语句以及引用游标。
1.1 EXECUTE IMMEDIATE语句
语法如下:
EXECUTE IMMEDIATE dynamic_sql_string
[INTO defined_variable1, defined_variable2, …]
[USING [in|out|in out] bind_argument1, bind_argument2,…]
[{RETURNING|RETURN} field1, field2, … INTO bind_argument1, bind_argument2, …]
DECLARE
sql_stmt VARCHAR2(1000);
plsql_block VARCHAR2(1000);
v_ooag011 ooag_t.ooag011%TYPE;
v_total_ooag NUMBER;
v_new_ooag011 ooag_t.ooag011%TYPE;
v_ooag001 ooag_t.ooag001%TYPE := '00261' ;
BEGIN
--用法一:
sql_stmt := 'CREATE TABLE ooag_t_bak' ||
' AS SELECT ooag001,ooag011 FROM ooag_t WHERE ooagent = 70 ' ||
' AND ooag001 = ' || v_ooag001;
EXECUTE IMMEDIATE sql_stmt