您的位置:首页 > 数据库

学习笔记-静态SQL和动态SQL

2015-01-12 03:15 176 查看
一:静态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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: