静态SQL是前置编译绑定,动态SQL是后期执行时才编译绑定。

场景:

动态SQL适用于表名及查询字段名未知的情况。在已知查询字段名及表名的情况下,使用动态SQL(字符串拼接方式)会增加硬解析的开销,在这种情况下,建议使用静态SQL,这样可以提高执行效率。在过程过程用拼凑的动态sql效率并不高。

因此,真实业务下适用动态sql的场景非常少,使用时也必须注意表结构的变动等因素,应该尽量在业务开发中使用动态sql。本人一般使用动态sql做数据采集;

用execute immediate实现动态sql:

----ddl
begin
execute immediate 'create table l_test(name varchar2(8))';
end;

带参数:

declare
----带参数
v_name l_test.name%type;
v_insql varchar(100); begin
v_name := '张三';
v_insql := 'insert into l_test(name)values(:1)';
execute immediate v_insql
using v_name;
commit;
end;

返回一行记录:

declare
----带参数
v_name l_test.name%type;
v_sql varchar(100); v_rec l_test%rowtype; begin
v_name := '张三';
v_sql := 'select * from l_test t where t.name=:v_n';
execute immediate v_sql
into v_rec
using v_name;
dbms_output.put_line(v_rec.name);
end;

返回多行记录:

declare
--v_name l_test.name%type;
v_sql varchar(100); type t_rec IS TABLE OF l_test%ROWTYPE;
v_arry_test t_rec; begin
v_name := '张三';
v_sql := 'select * from l_test t';
execute immediate v_sql bulk collect
into v_arry_test; for i in 1 .. v_arry_test.count loop
dbms_output.put_line(v_arry_test(i).name);
end loop; end;

结合游标:

declare
v_name l_test.name%type;
v_sql varchar(100);
type cur_type is ref cursor;
v_cur cur_type;
type t_rec IS TABLE OF l_test%ROWTYPE;
v_arry_test t_rec; begin
v_name := '张三';
v_sql := 'select * from l_test t where name=:v_n'; open v_cur for '' || v_sql
using v_name;
fetch v_cur bulk collect
into v_arry_test;
close v_cur;
for i in 1 .. v_arry_test.count loop
dbms_output.put_line(v_arry_test(i).name);
end loop;
end;

Oracle 动态sql的更多相关文章

  1. Oracle 动态sql 实现方式

    /******************************************************************* Sample Program 10: Dynamic SQL ...

  2. ORACLE动态sql在存储过程中出现表或视图不存在的解决方法

    Oracle动态sql在存储过程中出现表或视图不存在的解决方法 CREATE OR REPLACE PROCEDURE P_test is strsql varchar2(2000); BEGIN   ...

  3. Oracle动态SQL语句

    动态SQL返回游标: create or replace procedure proc_ValidityDueQuery( p_regioncode in number, p_pscode in nu ...

  4. Oracle 动态SQL 注意细节 ORA-00911: 无效字符

    随笔 - 46  文章 - 92  评论 - 5   lv_sql:='  insert into ETL_SUCESS_AMOUNT  select SEQ_OS_ETL_AMOUNTID.NEXT ...

  5. Oracle 动态sql小例子

    错误写法: create or replace procedure testproce20130228issqlstr varchar2(8000);date1 varchar2(10);begins ...

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

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

  7. 在Oracle中执行动态SQL的几种方法

    转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...

  8. ORACLE 动态执行SQL语句

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

  9. 【PL/SQL系列】Oracle存储过程使用动态SQL

    Oracle存储过程相信大家都比较了解,下面就为您介绍Oracle存储过程使用动态SQL的方法,希望对您能够有所帮助. CREATE OR REPLACE PROCEDURE P_STAT_SCORE ...

随机推荐

  1. android模拟器访问PC本地接口

    一般来讲PC本地接口是localhost:8080 而在安卓模拟器上用的话,他会映射模拟器本身的,也就是说,可以把模拟器也当成一个PC端来看待,这样会好理解点吧 而在模拟器上想要访问PC本地的loca ...

  2. c#十进制转二进制算法 和字符串反转算法

    去某软面试 面试官给个题上黑板做,写个算法 求95转2进制后1的个数. 我在黑板上敲了 static int count = 0; /// <summary> /// 获取10进制数转2进 ...

  3. c++ 程序崩溃生成Dump文件

    #include "Windows.h"#include "DbgHelp.h" int GenerateMiniDump(PEXCEPTION_POINTER ...

  4. Linux设置定时任务

    什么是crond?  crond是Linux系统用来定期执行命令或指定程序的服务的一种服务或软件.一般情况下当我们安装完成Linux操作系统之后,默认便会启动Crond任务调用服务.Crond服务会定 ...

  5. Vue系列之 => webpack-babel的配置

    安装 cnpm i babel-core@6.26.3 babel-loader@7.0.0 babel-plugin-transform-runtime -D cnpm i babel-preset ...

  6. 数据库表中不建索引,在插入数据时,通过sql语句防止重复添加

    sql 语句 INSERT IGNORE INTO table(aaa,bbb) SELECT '1111','2222' FROM DUAL WHERE NOT EXISTS( ' ) mybati ...

  7. python基础部分----文件、copy、内存指针

    0.来源:https://www.cnblogs.com/jin-xin/articles/9439483.html 1.is VS id() VS == 2.小数据池.代码块缓存机制 3.赋值符号= ...

  8. Git 爬坑路(从小白开始入门) ——(1)

    通过git管理项目之前,需要先注册一个GitHub账号,方便在远程仓库进行项目管理. Git之项目在本地仓库的管理(从小白开始): 一.push到远程项目 1.在个人的GitHub账号中,创建一个远程 ...

  9. 代码修改WinForm datagridview 样式 及数据绑定

    #region 表格设置 /// <summary> /// 调整表格 /// </summary> /// <param name="dataGrid&quo ...

  10. mySQL简单操作(一)

    推荐学习网站(https://sqlzoo.net/wiki/SQL_Tutorial) 1.创建mSQL数据表(表名,表字段名,定义表字段) create table tbl_name [if no ...