1.动态 SQL
动态 SQL 是指在PL/SQL程序执行时生成的 SQL 语句
编译程序对动态 SQL 不做处理,而是在程序运行时动态构造语句、对语句进行语法分析并执行
DDL 语句命令和会话控制语句不能在 PL/SQL 中直接使用,但是可以通过动态 SQL 来执行
执行动态 SQL 的语法:
EXECUTE IMMEDIATE dynamic_sql_string
[INTO define_variable_list]
[USING bind_argument_list];
execute immediate 字符串参数 [into] 变量 using 参数
immediate后面跟的参数:它是一个字符串类型的sql语句,或者字符串类型的plsql代码
into 变量:是把sql语句的执行结果保存到变量中
using 参数:传给sql语句的参数
如:
--按照员工编号查询员工的信息
declare
--声名一个变量保存员工信息
v_emp emp%rowtype;
--声名一个字符串类型变量
v_sql varchar2(255);
begin
execute immediate 'select * from emp where empno=7369' into v_emp;--字符换类型的sql语句
dbms_output.put_line(v_emp.ename||','||v_emp.job);
v_sql:='select * from emp where empno=7369';
execute immediate v_sql into v_emp;
dbms_output.put_line(v_emp.ename||','||v_emp.job);
v_sql:='select * from emp where empno=:a and deptno=:b';
execute immediate v_sql into v_emp using 7369,20;
dbms_output.put_line(v_emp.ename||','||v_emp.job);
end;
declare
--声名一个变量保存员工信息
v_emp emp%rowtype;
--声名一个字符串类型变量
v_sql varchar2(255);
--
n number(10):=1000;
begin
-- execute immediate 'update emp set sal=:1 where empno=:2' using n,7369 ;
--execute immediate 'delete from emp where empno=:1' using 7369;
execute immediate 'create table t(id number(11),name varchar2(20))';
end;
select * from emp where empno=7369;
select * from t;
eg:
查找出当前用户模式下,每张表的记录数,
以scott用户为例,结果应如下:
DEPT...................................4
EMP...................................14
BONUS.................................0
SALGRADE.............................5
DECLARE
v_n VARCHAR2(100);
v_m NUMBER;
BEGIN
FOR i IN (SELECT * FROM user_tables) LOOP
v_n:='select count(1) from'||i.table_name;
EXECUTE IMMEDIATE v_n INTO v_m;
dbms_OUTPUT.PUT_LINE(i.table_name||v_m);
END LOOP;
END;