码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-01-12 06:44:48      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:

一:静态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;

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

标签:

原文地址:http://www.cnblogs.com/hjiongjiong/p/4217613.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!