Oracle学习笔记第十三天
静态SQL和动态SQL
- 静态SQL
- 需要在编写PL/SQL程序时就确定的SQL语句
- 动态SQL
- 动态 SQL 是指在PL/SQL程序执行时生成的 SQL 语句
- DDL 语句命令和会话控制语句不能在PL/SQL 中直接使用,但是可以通过动态 SQL 来执行
- 编译程序对动态 SQL 不做处理,而是在程序运行时动态构造语句、对语句进行语法分析并执行
注意:DDL和DCL语句不能直接用在静态SQL,如果要用,可以用在动态SQL。
动态SQL实现方法:
方法1:
-
本地动态SQL:EXECUTE IMMEDIATE 语句执行
可以执行单行SQL,不能执行多行。
-
通过游标实现
可以执行多行SQL
方法2:DBMS_SQL程序包
方法详解:
-
EXECUTE IMMEDIATE 语句
-- 语法 EXECUTE IMMEDIATE dynamic_sql_string [INTO define_variable_list] [USING bind_argument_list];
解释: dynamic_sql_string 是动态SQL 语句字符串 INTO 子句用于接受SELECT语句选择的记录值 USING 子句用于绑定输入参数变量
-- 举例 -- 方式一 set serveroutput on; declare v_sql varchar2(200) := 'drop table emp2'; begin execute immediate v_sql; end; / -- 方式二 set serveroutput on; declare begin execute immediate 'drop table emp2'; end; /
set serveroutput on; declare v_sql varchar2(200) := 'select sal from emp where empno = :empno'; v_sal emp.sal%type; --保存查询结果 begin --into指定用来保存查询结果的变量 --using用来给绑定变量赋值 execute immediate v_sql into v_sal using &工号; dbms_output.put_line('查询到的工资为:'||v_sal); end; /
注意点:在定义这个变量SQL时,: 表示占位符,后面跟自己定义的变量名,格式甚至可以是:‘ :1 ’ ,执行语句中into是保存执行后的结果。
-
通过游标实现动态SQL
-- 语法 TYPE type_cursor IS REF CURSOR [RETURN return_type]; cursor_name type_cursor; OPEN cursor_name FOR dynamic_sql_string [USING bind_argument_list];
解释: dynamic_sql_string 是动态SQL 语句字符串 USING 子句用于绑定输入参数变量
-- 举例 set serveroutput on; declare --定义引用游标类型 type c_emp_type is ref cursor; --定义游标变量 c_emp c_emp_type; --定义变量保存查询sql v_sql varchar(200); --定义变量保存用户输入的部门编号 v_deptno number(4) := &部门编号; --定义变量保存查询结果 v_emp emp%rowtype; begin --确定查询sql v_sql := 'select * from emp where deptno = :deptno'; --打开游标 open c_emp for v_sql using v_deptno; loop fetch c_emp into v_emp; exit when c_emp%notfound; dbms_output.put_line('工号:'||v_emp.empno|| '姓名:'||v_emp.ename|| '工资:'||v_emp.sal|| '部门编号:'||v_emp.deptno); end loop; --关闭游标 close c_emp; end; /
-
通过DBMS_SQL程序包
实现步骤: 1. 将要执行的SQL 语句或一个语句块放到一个字符串变量中 2. 打开光标(游标) 3. 使用DBMS_SQL包的parse 过程来分析该字符串 4. 使用DBMS_SQL包的bind_variable 过程来绑定变量 5. 使用DBMS_SQL包的execute 函数来执行语句 6. 关闭光标(游标)
这个用的少,而且没有上面的方法直接,所以暂不介绍。