学习笔记-静态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;
在编写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;
相关文章推荐
- java静态和动态代理学习笔记
- 学习笔记_oracle——游标与动态SQL
- Mybatis学习笔记-动态SQL与模糊查询
- J2EE系列之MyBatis学习笔记(六)-- 动态sql
- Mybatis学习笔记七:动态SQL语句的使用
- SQL Server 2005 T-SQL学习笔记:建立动态的PIVOT
- myBatis学习笔记(6)——动态SQL & 模糊查询
- mybatis学习笔记(8)-动态sql
- DirectX11 学习笔记9 - 动态顶点缓冲区 和 静态顶点缓冲区
- Java学习笔记:反射与代理机制(静态、动态)
- JAVA学习笔记(四)substring、System.exit(1)、java.text.SimpleDateFormat、==、equals、StringBuffer、SQl动态查询
- 动态SQL(学习笔记)
- CSS中filter滤镜的学习笔记(静态滤镜及动态滤镜)
- OBJ-C动态类型&静态类型学习笔记
- Mybatis学习笔记-动态SQL与模糊查询
- 【个人学习笔记14之--浅谈动态SQL】
- sql语句学习笔记(12)-动态sql语句
- MyBatis学习笔记(五)---mybatis 动态sql语句
- android 开发零起步学习笔记(十五):android: 静态XML和动态加载XML混合使用,以及重写Layout控件
- MYSQL学习笔记2--mysql 静态和动态plugin