标签:
一:静态SQL
在编写pl/sql程序的时候,sql语句已经编写好了(编译时确定)
ddl和会话控制语句不能在pl/sql中直接使用
二:动态SQL
在编写pl/sql程序的时候,sql语句还不确定
不编译,执行时动态确定
需要根据用户输入参数动态确定SQL语句
解决pl/sql中不支持ddl语句的问题
动态SQL语法:
EXECUTE IMMEDIATE ‘DDL,DML语句’ ---sql语句是字符串的形式,sql语句中若有参数,可以:参数名使用
[INTO 〈变量序列〉] --用于接受select语句选择的记录值
[USING 〈参数序列〉]; --用于绑定输入参数变量
- - EXECUTE IMMEDIATE语句只能执行返回一行,或者没有的sql语句
需要执行返回多行的sql语句时,可以使用ref动态游标
动态创建返回多行的sql语句
语法:
声明跟普通ref游标一样,只是打开时不同
OPEN ref游标名 FOR ‘sql语句字符串’
[ USING 〈参数列〉];
示例----动态SQL-------------------------------
DECLARE
v_id NUMBER := &vid;
v_name VARCHAR2(20) := ‘&vname‘;
v_sex VARCHAR2(20) := ‘&sex‘;
insert_sql VARCHAR2(200) := ‘insert into student values(:1,:2,:3)‘; ---:1为绑定变量,是动态SQL中的一个占位符
BEGIN
EXECUTE IMMEDIATE insert_sql USING v_id,v_name,v_sex; ----EXECUTE IMMEDIATE后面可以直接加‘字符串sql语句’
END;
示例2----------ref动态游标---------
DECLARE
TYPE ref_cur IS REF CURSOR;
rc ref_cur;
emp_row dept%ROWTYPE;
select_sql VARCHAR2(200) := ‘select * from dept‘;
BEGIN
OPEN rc FOR select_sql;
LOOP
FETCH rc INTO emp_row;
EXIT WHEN rc%NOTFOUND;
--dbms_output.put_line(rc%ROWCOUNT||‘ ‘||emp_row.empno||‘ ‘||emp_row.ename||‘ ‘||emp_row.sal);
dbms_output.put_line(emp_row.deptno||emp_row.dname);
END LOOP;
CLOSE rc;
END;
标签:
原文地址:http://www.cnblogs.com/hjiongjiong/p/4217613.html