静态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. [阿里云] 云数据库mongodb外网连接

    原教程,https://www.alibabacloud.com/help/zh/doc-detail/55253.htm 但按照这里的教程,还是连不上mongdb,甚至在ECS上也ping不通mon ...

  2. 201902<<百岁人生>>

    过年的那段时间,在家看到公司推荐的10本2019年必读书籍,里面有这本书,于是就开始了.... 第一次这么认真的看这类书籍,看完之后感触颇多,毕竟这个问题我从没思考过,很少站在这样的高度去看所有方方面 ...

  3. redis 列表(list)函数

    列表(list)函数 lPush 命令/方法/函数 Description Adds the string value to the head (left) of the list. Creates ...

  4. Oarcle之序列

    序列:是一种数据库对象,用来自动产生一组唯一的序号: 序列:是一种共享式的对象,多个用户可以共同使用序列中的序号. 创建序列 create sequence seq_emp_temp incremen ...

  5. 安卓入门——————简单记账本的开发(用sqlite存储数据)(一)

    设计思想————首先要确定有几个页面.和每个页面的大致布局 由于是入门,我也是学习了不是很长的时间,所以项目比较low.... 第一个页面,也就是打开APP的首页面: 今天这个博客,先实现添加功能!: ...

  6. 记字符串转bigDecimal的一个坑

    项目中一个地方用到了bigdecimal,之前是字符串转Double,处理之后再转成String,看着麻烦,给改成用bigdecimal计算字符串,但是偶尔会出现如下异常. 很是诧异,加了非空校验,怎 ...

  7. jsp页面在Android系统和ISO系统的兼容性问题

    问题:一个jsp页面在Android手机上显示正常,但到了ISO系统上jsp页面的样式不显示了. 原因:css文件中设置样式时单位不兼容. 解决方案:将rem 转换成px;

  8. 利用phpspider爬取网站数据

    本文实例原址:PHPspider爬虫10分钟快速教程 在我们的工作中可能会涉及到要到其它网站去进行数据爬取的情况,我们这里使用phpspider这个插件来进行功能实现. 1.首先,我们需要php环境, ...

  9. 使用go-template自定义kubectl get输出

    kubectl get相关资源,默认输出为kubectl内置,一般我们也可以使用-o json或者-o yaml查看其完整的资源信息.但是很多时候,我们需要关心的信息并不全面,因此我们需要自定义输出的 ...

  10. 【spotlight安装监控】

    参考博客: https://www.cnblogs.com/ceshi2016/p/9012646.html http://blog.sina.com.cn/s/blog_1517220f20102x ...