很多时候我们需要在存储过程中使用动态的SQL,要怎么用好动态SQL呢,怎样执行效率最高呢。下面来介绍一下,如何使用动态SQL操作数据库。

在存储过程中执行一个简单的SQL语句使用下面的方法即可。

DECLARE
BEGIN/* 使用该方法来创建一个新数据表,但这方法需要当前用户具有创建表的权限。 */EXECUTE IMMEDIATE 'create table test (data1 number, data2 number)';END;
/
DECLARE
BEGIN/* 使用这个方法删除一个已存在的数据表,需要删除权限。 */EXECUTE IMMEDIATE 'drop table test';END;
/

SQL文中不能对数据表名使用变量替换方法,则如需动态填入表名,实现方法如下。
create table :tbl1 ... 是不被允许的。

DECLAREtbl1 VARCHAR2(40);sql1 VARCHAR2(2000);
BEGINtbl1 := 'test';sql1 := 'create table ' || tbl1 || ' (data1 number, data2 number)';EXECUTE IMMEDIATE sql1;END;
/

使用变数替换带入数值的方式实现方法如下列代码。

DECLAREsql1 VARCHAR2(2000);
BEGINsql1 := 'insert into test values (:data1, :data2)';EXECUTE IMMEDIATE sql1 USING 100, 200;END;
/

对与带入的数值,可以使用其他的变量代替传入。
如下代码使用变量带入参数。

DECLAREdata1 NUMBER;data2 NUMBER;sql1 VARCHAR2(2000);
BEGINdata1 := 100;data2 := 200;sql1 := 'insert into test values (:data1, :data2)';EXECUTE IMMEDIATE sql1 USING data1, data2;END;
/

执行结果可以被取得,但如果不是返回单行记录是,会报出错误信息。

SET serveroutput ON;DECLAREtest_rec test%ROWTYPE;sql1 VARCHAR2(2000);
BEGINsql1 := 'select * from test where field1 = :data1';EXECUTE IMMEDIATE sql1 INTO test_rec USING 100;dbms_output.put_line ('-- 取得データ --');dbms_output.put_line (test_rec.field1);dbms_output.put_line (test_rec.field2);END;
/

如果返回结果为多行数据,则应使用open for 和 fetch方法。

SET serveroutput ON;
/* 抽出一列数据的时候 */
DECLARETYPE cutype IS REF CURSOR;cv cutype;item1 testm.key1%TYPE;
BEGINOPEN cv FOR'select key1 from testm where key1  like :data1'USING 'a%';LOOPFETCH cv INTO item1;EXIT WHEN cv%notfound;dbms_output.put_line (item1);END LOOP;CLOSE cv;END;
/
SET serveroutput ON;
/* 整行数据抽出时 */
DECLARETYPE cutype IS REF CURSOR;cv cutype;rec テストm%ROWTYPE;  /*行模型*/
BEGINOPEN cv FOR'select * from テストm where キー like :data1'USING 'a%';LOOPFETCH cv INTO rec;EXIT WHEN cv%notfound;dbms_output.put_line (rec.キー);END LOOP;CLOSE cv;END;

更新SQL执行结果也可以被取得。

  codingset serveroutput ON;DECLAREsql1 VARCHAR2(2000);ret1 NUMBER;
BEGINsql1 := 'update test set data2 = :data2 where data1 = :data1returning data2 into :ret1';EXECUTE IMMEDIATE sql1 USING 11, 100 RETURNING INTO ret1;dbms_output.put_line ('-- 取得データ --');dbms_output.put_line (ret1);END;
/

动态 SQL、EXECUTE IMMEDIATE、using、into、returning相关推荐

  1. oracle动态语句事务,oracle 动态SQL execute immediate

    execute immediate的语法如下: execute immediate 'sql'; execute immediate 'sql_select' into var_1, var_2; e ...

  2. oracle中execute函数,Oracle 动态SQL execute immediate写法 zt

    Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者.试验步骤如下: 1. DDL 和 DML/*** DDL ***/ begin EXEC ...

  3. Oracle中动态SQL详解

    1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一 ...

  4. Oracle 存储过程,Hibernate 调用存储过程,JDBC调用存储过程,Oracle 动态SQL

    Oracle 存储过程学习 目录 Oracle 存储过程........................................................................ ...

  5. Oracle 动态SQL语句

    Oracle 动态SQL语句     EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包.  它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块 ...

  6. 如何使用动态SQL语句?

    这里只介绍动态SQL的使用.关于动态SQL语句的语法,参见:http://blog.csdn.net/chiclewu/article/details/16097133 1.什么是时候需要使用动态SQ ...

  7. (转)动态SQL和PL/SQL的EXECUTE IMMEDIATE选项

    EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EX ...

  8. 动态SQL和PL/SQL的EXECUTE选项分析

    EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EX ...

  9. sqlserver 动态sql执行execute和sp_executesql

    sqlserver 动态sql的执行,有两个方法execute和 sp_executesql.其中第一个方法execute可以简写为exec. execute方法适合执行没有返回值的动态sql,sp_ ...

最新文章

  1. #第六次会议#(4.21)
  2. 比较排序算法的时间复杂度 c语言,c语言四种排序算法时间复杂度比较(10页)-原创力文档...
  3. 随想录(学习英文的好处)
  4. 为什么云原生+分布式是数据库的未来?
  5. 单机传奇找不到登陆器服务器列表,如果传奇服务端里面没有带登陆器怎么办?...
  6. excel求和为零的解决方法
  7. Unity 视频编码器问题解决方案(视频卡顿,花屏,黑屏)
  8. maven的jar包引入成功却仍然爆红
  9. html hide特效,jQuery / 动画与特效中的显示show和隐藏hide - 汇智网
  10. SQLServer集群故障节点DISCONNECTED
  11. WIFI信号强度获取
  12. ctf解题--当眼花的时候,会显示两张图(隐写)
  13. 手把手教你架设电影服务器
  14. logcat 命令行用法
  15. 智能服务机器人产品及解决方案
  16. Java生成XML数字签名
  17. lucky前面加a还是an_luck、lucky、luckily的区别和用法-luckly-英语-徐似眉同学
  18. 岁末南亚大劫难[图片新闻]
  19. 阿里云轻量服务器开放指定端口
  20. Activiti 工作流入门到大神-任亮-专题视频课程

热门文章

  1. 机器学习:多层感知机原理及实现
  2. leetcode-20-有效的括号
  3. 2-10日偶听某箴言
  4. ArcGIS Android工程迁移到其他电脑不能打开的问题
  5. BZOJ 3910 并查集+线段树合并
  6. 设置兼容性[指定IE浏览器渲染方式]
  7. Linux查看CPU型号及内存频率及其它信息与清理内存的命令
  8. TCP三次握手连接及seq和ack号的正确理解
  9. 编译makefile出错解决办法
  10. Apache的网页和安全优化