Oracle 动态sql
静态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的更多相关文章
- Oracle 动态sql 实现方式
/******************************************************************* Sample Program 10: Dynamic SQL ...
- ORACLE动态sql在存储过程中出现表或视图不存在的解决方法
Oracle动态sql在存储过程中出现表或视图不存在的解决方法 CREATE OR REPLACE PROCEDURE P_test is strsql varchar2(2000); BEGIN ...
- Oracle动态SQL语句
动态SQL返回游标: create or replace procedure proc_ValidityDueQuery( p_regioncode in number, p_pscode in nu ...
- Oracle 动态SQL 注意细节 ORA-00911: 无效字符
随笔 - 46 文章 - 92 评论 - 5 lv_sql:=' insert into ETL_SUCESS_AMOUNT select SEQ_OS_ETL_AMOUNTID.NEXT ...
- Oracle 动态sql小例子
错误写法: create or replace procedure testproce20130228issqlstr varchar2(8000);date1 varchar2(10);begins ...
- [转]ORACLE 动态执行SQL语句
本文转自:http://zhaisx.iteye.com/blog/856472 Oracle 动态SQLOracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediat ...
- 在Oracle中执行动态SQL的几种方法
转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...
- ORACLE 动态执行SQL语句
本文转自 http://zhaisx.iteye.com/blog/856472 Oracle 动态SQL Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immedia ...
- 【PL/SQL系列】Oracle存储过程使用动态SQL
Oracle存储过程相信大家都比较了解,下面就为您介绍Oracle存储过程使用动态SQL的方法,希望对您能够有所帮助. CREATE OR REPLACE PROCEDURE P_STAT_SCORE ...
随机推荐
- redis php操作命令
redis的五种存储类型的具体用法 String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者 ...
- 佳佳的Fibonacci
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #inclu ...
- 【转】2、Jenkins构建完成自动发送邮件
1.开通163邮箱的授权码服务,和SMTP服务.百度找教程.2.安装 Email Extension Plugin 插件,已安装或版本自带可跳过此步骤.3.进入系统管理–系统设置首先配置 Jenkin ...
- C# 获取 串口 设备名称 与 串口号 ManagementObjectSearcher类
1.效果图: 2.代码 class Program { static void Main(string[] args) { GetComList(); } private static void Ge ...
- mika的模板库
二分图最大匹配: 1.匈牙利算法:注意dfs中是dfs(c[w[i]]),搜索的是与之匹配的点. #include<cstdio> #include<cstring> ],w[ ...
- 2018-2019-2 20165335 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...
- liunx驱动----系统滴答时钟的使用
2019-3-12系统滴答定时器中断使用 定义一个timer 其实就是使用系统的滴答定时器产生一个中断. 初始化timer init_timer函数 实现如下 void fastcall ini ...
- redis知识点汇总
1. redis是什么 2. 为什么用redis 3. redis 数据结构 4. redis中的对象类型 5. redis都能做什么?怎么实现的的? 6. redis使用过程中需要注意什么 7. 数 ...
- springmvc配置之mvc:annotation-driven
为了简化springmvc配置,spring同时引入了mvc namespace, 配置了 <mvc:annotation-driven/> spring会默认注册a RequestMap ...
- Nginx 出现 _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/
Nginx 出现 _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/ 这种情况是因为 application 没有足的权限 .需要给予777的权限就能解决了