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 ...
随机推荐
- 关于java实现自定义曲线拟合的研究
项目需要拟合曲线,使用java实现.采用了apache-commons-math3实现自定义的曲线. 作为apache开源的搞数学计算的超强的库,一直不受市场重视.为啥呢?经过研究,使用java这个强 ...
- 写好shell脚本
转载自https://mp.weixin.qq.com/s/f3xDHZ7dCQr7sHJ9KDvuyQ 1.提供--help标记 安装在系统上的二进制文件通常带有man帮助文档,但对于脚本来说就不一 ...
- Flask-Script
其实本章就是为下一章做的铺垫啦,但是也要认真学习哦 Flask-Script 从字面意思上来看就是 Flask 的脚本 Django的启动命令是:python manager.py runserver ...
- java爬取免费HTTP代理 code-for-fun
偶然看到一个提供免费HTTP 代理IP的网站,该网站一两个小时就会更新一次,很有用.之后自己就用Java写了一个爬虫,爬取网站上的代理IP,以备后用. 网站源码: <!DOCTYPE html& ...
- dotnetcore ef 调用多个数据库时用户命令执行操作报错
dotnetcore ef 调用多个数据库时用户命令执行操作报错 1.多个DbContext 时报错: 报错: More than one DbContext was found. Specify w ...
- go 语言
go语言(或 Golang)是Google在 2007 年开发的一种开源编程语言,于2009年11月开源,2012年发布go稳定版 go是非常年轻的一门语言,它的主要目标是“兼具Python 等动态语 ...
- tensorflow学习笔记3:写一个mnist rpc服务
本篇做一个没有实用价值的mnist rpc服务,重点记录我在调试整合tensorflow和opencv时遇到的问题: 准备模型 mnist的基础模型结构就使用tensorflow tutorial给的 ...
- C# 多笔数据导入DB
6万笔数据瞬间导入进DB 命名空间 using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel; //Filename为文件路径 public JsonR ...
- linux单项目发布流程
1.安装python #1.安装python3.7所需要的依赖包yum -y groupinstall "Development tools"yum -y install zlib ...
- vue webpack 引入iview iview内部文件报语法错误
错误如下: 是因为 es6 语法没有成功转化 因为 我的项目是别人做好的已经部署的项目 ,但是用到的是es2015 配置es2015并不起作用 是因为es2015已经过期了 安装的时候回有类似下面的 ...