Oracle中执行动态SQL
作者:springsnow 发布时间:2024-01-19 20:55:37
一、概述
在一般的sql操作中,sql语句基本上都是固定的,如: SELECT t.empno,t.ename FROM scott.emp t WHERE t.deptno = 20;
但有的时候,从应用的需要或程序的编写出发,都可能需要用到动态SQl,如:
当 from 后的表 不确定时,或者where 后的条件不确定时,都需要用到动态SQL。
使用execute immediate语句可以处理包括ddl(create、alter和drop)、DCL(grant、revoke)、DML(insert、update、delete)以及单行select语句。
execute immediate语句:
execute immediate dynamic_string
[into {define_variable[,define_variable]…|record}]
[using [in|out|in out] bind_argument[,[in|out|in out]bind_argument]…]
[{returning|return} into bind_argument[, bind_argument]…]
define_variable用于指定存放单行查询结果的变量;
using in bind_argument用于指定存放传递给动态sql值的变量,即在dynamic中存在占位符时使用;
using out bind_argument用于指定存放动态sql返回值的变量。
二、执行ddl、dcl语句
不能使用into和using子句。
begin
execute immediate 'create table ma_org(org_codevarchar2(20),org_name varchar2(254))';
execute immediate 'drop table ma_org';
end;
语句
begin
execute immediate 'grant insert on ma_org to scott'
end;
三、处理dml语句
1、给动态语句传值(USING 子句)
如果dml语句包含占位符,那么在execute immediate语句之后必须要带有using子句;
declare
orgcode varchar2(10);
orgname varchar2(254);
begin
orgcode := 1200;
execute immediate 'select org_name fromma_org
where org_code = :X'
into orgname
using orgcode;
dbms_output.put_line(orgname);
end;
2、从动态语句检索值(INTO子句)
3、动态调用存储过程
declare
l_routin varchar2(100) := 'gen2161.get_rowcnt';
l_tblnam varchar2(20) := 'emp';
l_cnt number;
l_status varchar2(200);
begin
execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
using in l_tblnam, out l_cnt, in out l_status;
if l_status != 'OK' then
dbms_output.put_line('error');
end if;
end;
4、处理包含returing子句的DML语句
如果dml语句带有returning子句,那么在execute immediate语句之后必须带有returning into子句,并且此时只能处理作用的单行上的dml语句,如果dml语句作用在多行上,则必须使用bulk子句。
declare
orgcode varchar2(10);
orgname varchar2(254);
rname varchar2(254);
begin
orgcode := '1200';
orgname := '天津市分行';
execute immediate 'update ma_org set org_name=:X
where org_code = :Y returning org_name into :rname'
using orgname, orgcode
returning into rname;
dbms_output.put_line(orgname);
end;
5、在retuing into中使用bulk collect into
四、处理多行查询
oracle通过使用bulk collect into子句处理动态sql中的多行查询可以加快处理速度,从而提高应用程序的性能。当使用bulk子句时,集合类型可以是plsql所支持的索引表、嵌套表和varray,但集合元素必须使用sql数据类型。在oracle9i以后,有三种语句支持bulk子句,execute immediate,fetch和forall。
1、使用动态游标(游标变量)处理多行查询类动态sql语句。
DECLARE
TYPE ref_cur IS REF CURSOR;
rc ref_cur;
emprow emp%ROWTYPE;
v_sql VARCHAR2(100):= 'select * from emp where deptno = :x'; --动态执行的SQL语句
BEGIN
OPEN rc FOR v_sql USING 30; --打开游标,绑定执行的SQL语句,并传递参数
LOOP
FETCH rc INTO emprow;
EXIT WHEN rc%NOTFOUND;
dbms_output.put_line('name:'||emprow.ename||' sal:'||emprow.sal);
END LOOP;
CLOSE rc;
END;
2、在execute immediate中使用bulk collect into
示例:
declare
type org_table_type is table of ma_org%rowtype;
org_table org_table_type;
v_orgcode varchar2(20);
begin
v_orgcode := '%00%';
execute immediate 'select * from ma_org where org_code like:v_orgcode' bulk collect into org_table
using v_orgcode;
for i in 1..org_table.count
loop
dbms_output.put_line(org_table(i).org_code||','||org_table(i).org_name);
end loop;
end;
3、在forall语句中使用bulk collect into语句
示例:
declare
type type_org_code is table of ma_org.org_code%type;
type type_org_name is table of ma_org.org_name%type;
v_orgcode type_org_code;
v_orgname type_org_name;
begin
v_orgcode := type_org_code('1100','1200');
forall i in 1..v_orgcode.count
execute immediate 'update ma_org set org_name = org_code||org_namewhere org_code = :p1 returning org_name into :p2'
using v_orgcode(i)
returning bulk collect into v_orgname;
for i in v_orgname.first..v_orgname.last
loop
dbms_output.put_line(v_orgname(i));
end loop;
end;
来源:https://www.cnblogs.com/springsnow/archive/2011/12/09/2282528.html


猜你喜欢
- 概 述 ---- 现在有不少介绍利用ASP实现动态分页的文章,方法大同小异,就是每次利用ADO返回原始
- 朴素贝叶斯(Naive Bayes,NB):朴素贝叶斯分类算法是学习效率和分类效果较好的分类器之一。朴素贝叶斯算法一般应用在文本分类,垃圾邮
- 本文实例讲述了GO语言实现简单TCP服务的方法。分享给大家供大家参考。具体实现方法如下:package mainimport ("
- 描述:让Len,Left,Right函数识别中文;对中文识别为两个字符,ASCII码为一个;可用此函数代替Len,Left,Right函数。
- 本文实例为大家分享了python正则实现计算器功能的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*- # A
- 图像在计算机中的存储图像其实就是一个像素值组成的矩阵。1、黑白或灰度图像如何存储在计算机中在这里,我们已经采取了黑白图像,也被称为一个灰度图
- mysqladmin 工具的使用格式:mysqladmin [option] command [command option] comman
- 在用csv.writer写入文件的时候发现中间有多余的空行。最早打开方式只是‘w',会出现多余的空行,网上建议使用binary形式‘
- 自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言工具箱(NLTK,NaturalLanguageToolkit)是一个基
- 先问一个问题, 在firefox 2里,正则表达式字符"\d"全等于"[0-9]"吗?有可能你会答&
- 本文实例讲述了Python3读取zip文件信息的方法。分享给大家供大家参考。具体实现方法如下:该程序接受一个字符串,其内容是一个zip文件,
- 有些朋友看到这个标题可能会有疑问,难道在视图中使用*符号还有何要注意的地方吗?对于这个问题,我们先不必回答,先看一下例子吧。 我这里,使用的
- 语句SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field&quo
- 本文实例讲述了Python实现繁体中文与简体中文相互转换的方法。分享给大家供大家参考,具体如下:工作中需要将繁体中文转换成简体中文上网找了些
- 1.下载pyinstaller并解压(可以去官网下载最新版):https://github.com/pyinstaller/pyinstal
- 列表列表是Python中最具灵活性的有序集合对象类型。与字符串不同的是,列表可以包含任何类型的对象:数字、字符串甚至其他列表。列表是可变对象
- 从有道词典网页获取某单词的中文解释。import reimport urllibword=raw_input('input a wo
- 柱状图分类QBarSeries:竖向柱状图QPercentBarSeries:竖向百分比柱状图QStackedBarSeries:竖向堆叠柱
- IIS上设置301 跳转相信大家都会,只要在网站-属性-主目录里 选择重定向URL就行了,这样整站就跳转到目标站点了,但是有个问
- 这篇是Nicholas讨论如果防止脚本失控的第二篇,主要讨论了如何重构嵌套循环、递归,以及那些在函数内部同时执行很多子操作的函数。基本的思想