一。为什么要使用动态执行语句?

由于在PL/SQL 块或者存储过程中只支持DML语句及控制流语句,并不支持DDL语句,所以Oracle动态执行语句便应允而生了。关于DDL与DML的区别,请参见:DDL语句与DML语句及DCL和TCL

二。动态执行语句怎么用?

动态执行语句代替了Oracle 8i中的DBMS_SQL Package包。

1)在PL/SQL中运行SQL语句,例如:

示例一:

BEGIN 
              EXECUTE IMMEDIATE 'select count(username) from user_users';     --DML每条语句必须以分号结尾
       END;

示例二:

BEGIN 
               EXECUTE IMMEDIATE  'ALTER TABLE a RENAME TO EXAMPLE';    --DDL
        END;

你可能会问不是只DDL语句需要用动态语句执行吗?是的,你说的完全正确。但是DML语句用动态语句执行也可以。

即:DDL语句只能用动态执行语句来执行,DML语句亦可用动态语句来执行。

    2)使用using给动态语句传值,例如:

DECLARE
                e_name VARCHAR2(10); --声明变量e_name
                e_age INT;                        --声明变量e_age
         BEGIN
                e_name :=  'sillylaura';      --给变量e_name赋值
                e_age := 21;                     --给变量e_age 赋值
                EXECUTE IMMEDIATE 'insert into Example values(seq_add_by_one.nextval,:2,:3)' using e_name,e_age;  --DML             END;

3)使用动态语句赋值(select 列名 into 变量 from ……)

         DECLARE 
                        temp INT; 
         BEGIN
                        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM dual'  INTO temp; --DML

dbms_output.put_line(temp);
         END;

4)传递并检索值:into用在using之前。

DECLARE
                   temp INT;
                   test VARCHAR2(10);
         BEGIN
                 test := 'ok';
                 EXECUTE immediate 'SELECT COUNT(*) FROM dual where dummy = :1 GROUP BY dummy' INTO temp USING test;
                 dbms_output.put_line(temp ||'  '|| test); 
         EXCEPTION WHEN OTHERS  THEN 
                 dbms_output.put_line('It has no data!'); 
         END;

三。动态语句小结

  1. DDL语句只能用动态执行语句来执行,DML语句亦可用动态语句来执行。
  2. 在使用select……into子句为变量赋值时,into字句必须写在单引号外面。
  3. 在同时使用select……into子句和using时,注意二者的顺序:into用在using之前,且都在单引号外面。
  4. 注意写上必要的异常错误处理。
 
 
 

Oracle动态执行语句的更多相关文章

  1. SQL函数中的动态执行语句

    一.为什么要使用动态执行语句? 由于在PL/SQL 块或者存储过程中只支持DML语句及控制流语句,并不支持DDL语句,所以Oracle动态执行语句便应允而生了.关于DDL与DML的区别,请参见:DDL ...

  2. Oracle动态执行表不可访问解决方法

    在scott 用户下,执行查询语句是出现“Oracle动态执行表不可访问” 经查,是因为用户权限不够所致,修改scott用户权限语句如下: grant select on V_$session to ...

  3. Oracle动态执行表不可访问

    在scott 用户下,执行查询语句是出现"Oracle动态执行表不可访问" 经查,是因为用户权限不够所致,修改scott用户权限语句如下: grant select on V_$s ...

  4. [转]ORACLE 动态执行SQL语句

    本文转自:http://zhaisx.iteye.com/blog/856472 Oracle 动态SQLOracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediat ...

  5. oracle 关于动态执行语句 execute immediate 的用法

    当在开发的应用场景中 数据库处理复杂业务逻辑里用到 SQL 语句拼接    可以用  execute immediate   来执行语 举个例子 insert into tb_temp_public( ...

  6. ORACLE 动态执行SQL语句

    本文转自 http://zhaisx.iteye.com/blog/856472 Oracle 动态SQL Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immedia ...

  7. Oracle 函数中动态执行语句

    函数: 1 create or replace function fn_test(tablename in varchar2) return number is sqls ); rtn ):; beg ...

  8. orcale 动态执行语句

    create or replace function fn_test2(tablename in varchar2) return number is rtn number; begin --通用的获 ...

  9. Oracle动态执行脚本创建序号

    -----------------------动态创建序列的脚本--------------------------- declare type num_list ) ); -- 老师表.学生表 xz ...

随机推荐

  1. 1211php面向对象

    首先需要定义数组,$attr = array(直接给元素1,2,3)索引数组 关联数组 $attr = array("one"=>1,2,3) for($i=0;$i< ...

  2. S2SH简介

    struts2简介 Struts2是由WebWork基础上发展起来的,与struts1比较,选用struts2的理由是:①Struts1要求Action类继承一个抽象基类,而Struts 2 Acti ...

  3. Auto_increment详解

    Auto_increment Mysql AUTO_INCREMENT 1.Innodb表的自动增长列可以手工插入,但是插入的值如果是空或者0,则实际插入的将是自动增长后的值 mysql> cr ...

  4. <Oracle Database>数据库启动与关闭

    启动和关闭Oracle数据库 要启动和关闭数据库,必须要以具有Oracle 管理员权限的用户登陆,通常也就是以具有SYSDBA权限的用户登陆.一般我们常用INTERNAL用户来启动和关闭数据库(INT ...

  5. Linux Ubuntu12.04下安装OpenCv2.4.10

    参考 http://blog.sina.com.cn/s/blog_53b0956801010lfu.html 捣鼓了一个晚上了,OpenCv还没装好,本来以为看个类似的比如Ubuntu安装OpenC ...

  6. 如何安装win10+Red Hat Enterprise Linux双系统?

    1,如何安装win10+Red Hat Enterprise Linux双系统???? 有很多人(没做过调查,可能就我自己想装吧)想要安装Red Hat Enterprise Linux系统,但是又不 ...

  7. Android 多个include标签的监听事件处理

    include标签的作用是为了xml文件代码的模块化,详细不再多提.主要是说说include标签的监听. 网上也有很多例子,不过大多是只写了一个include标签的监听,如果需要实现多个include ...

  8. C#的winform编程入门简单介绍

    C#中事件.事件委托.事件的订阅 例子: using System.Timers; Timer t1 = new Timer(); t1.Tick += new EventHandler(XX); p ...

  9. 使用UG UISTYLER 窗体编辑器,创建对话框 part 2

    接下来看看自动生成的cs文件里的东西吧,下面是之前保存的窗体的cs文件: 如果仅仅做一些UG开发没有太多的语言基础,那并不需要去了解初始函数内的东西.只需要了解下3类入口函数如何修改和如何应用就可以了 ...

  10. 【sqlyog(mysql)Test Connection功能实现的原理】

    sqlyog这个软件中有:Test Connection(测试连接)这样的一个功能, 现在我的开发环境是java和mysql,接下来一起探索这个功能的实现过程: