- 浏览: 455980 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (233)
- 技术日志 (87)
- portal (7)
- jBPM/Activiti (34)
- Roller学习 (18)
- Java基础、网站开发 (19)
- 收藏URL (4)
- UML (3)
- linux操作 (7)
- 工作环境准备 (8)
- Mina (15)
- tomcat (8)
- Mylyn (3)
- sina网站 (2)
- 规则引擎 (3)
- 工作记录 (11)
- html(5) (9)
- 手机开发 (3)
- oracle (26)
- 常用的 (2)
- maven (8)
- hadoop (0)
- xml (7)
- 错误解决 (5)
- linux (1)
- c# (2)
- c++ (1)
- node.js (1)
- 银行业务知识 (1)
- Java调试 (0)
最新评论
-
tomcatmeng:
请问候选用户是怎样task自己的任务,看网上说先根据任务id先 ...
jBPM4.4:ForEach的使用--动态设置参与人数 -
maoweiwer:
友情提醒:如果是在MYSQL下创建数据库,则还需要更改\jbp ...
jBPM4.4: 创建数据库表 -
zybing:
ganjiang 写道有点疑惑,请lz指点,1.那个“depl ...
jBPM4.4:如何图示化显示当前的流程执行到了哪一步骤 -
zybing:
ganjiang 写道有点疑惑,请lz指点,1.那个“depl ...
jBPM4.4:如何图示化显示当前的流程执行到了哪一步骤 -
ganjiang:
有点疑惑,请lz指点,1.那个“deployId”不知是那个i ...
jBPM4.4:如何图示化显示当前的流程执行到了哪一步骤
通常运用DBMS_SQL包一般分为几步:
1. open cursor: 打开cursor
2. parse cursor:解析你要执行的SQL语句
3. bind variable:如果要执行的SQL语句中包含变量,在此就需要绑定变量
4. execute:执行SQL语句
5. close cursor:在执行后关闭此cursor.
如果你还需要返回执行SQL的结果集,还需要使用define_column,define_array等方法。
下面根据不同情况进行详细展示:
在做展示之前,先准备一些基础数据create table demo (a number,b number,c number);
begin
for i in 1 .. 15 loop
insert into demo
values
(round(dbms_random.value, 2) * 100,
round(dbms_random.value, 2) * 100,
round(dbms_random.value, 2) * 100);
end loop;
commit;
end;
基础数据完成之后,下面开始对一些具体情况进行分析:
1.执行一般的select语句
首先先介绍最常用情况: create or replace procedure define_column(no in number) is
cursor_name integer := dbms_sql.open_cursor; --在初始化参数时,就可以打开cursor;
row_process integer;
v_b number;
begin
--解析要执行的SQL.
dbms_sql.parse(cursor_name,
'select * from demo where a= :no',
dbms_sql.native);
--如果要执行的SQL中不需要参数,则可以省略掉bind_variable--
dbms_sql.bind_variable(cursor_name, 'no', no);
/*如果需要返回查询语句的结果,则必须在exec之前使用define_column函数定义返回字段;define_column函数的第一个参数是最初定义的cursor name,第二个参数是指需要返回的字段在查询结果中处于第几列,在此例中返回的字段是查询结果中的第二列,即b列;第三个参数就是接收返回结果需要的变量*/
dbms_sql.define_column(cursor_name, 2, v_b);
--必须定义一个参数接收exec的结果
row_process := dbms_sql.execute(cursor_name);
loop
if dbms_sql.fetch_rows(cursor_name) > 0 then
--将前面定义的字段返回给变量v_b--
dbms_sql.column_value(cursor_name, 2, v_b);
dbms_output.put_line('B is ' || v_b);
else
exit;
end if;
end loop;
--数据处理完成后记得要将cursor关闭
dbms_sql.close_cursor(cursor_name);
exception
when others then
dbms_sql.close_cursor(cursor_name);
end;
2.使用define_array方法得到查询结果
前面已经分析了如何使用define_column方法得到查询结果,但有时我们想要一次得到多行查询结果,此时我们就需要使用define_array方法,此方法常用于DML操作,稍后会有例子对此介绍,现在先来看一下如果使用define_array. create or replace procedure define_array is
c NUMBER;
d NUMBER;
/*DBMS_SQL.NUMBER_TABLE类型实际就是type NUMBER_TABLE is table of number index by binary_integer;*/
n_tab DBMS_SQL.NUMBER_TABLE;
n_tab1 DBMS_SQL.NUMBER_TABLE;
indx NUMBER := 1;
BEGIN
c := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(c,
'select * from demo where rownum<13 order by 1',
DBMS_SQL.NATIVE);
/*在此需要特别介绍一下define_array函数的第一个参数是已经打开的cursor名称, 第二个参数是指需要返回的字段在查询结果中处于第几列,第三个参数就是接收返回结果需要的变量,与define_column不同的是此变量是table,而不是普通的字段类型;第四个参数表示一次可以返回的行数;第五个参数是指n_tab的index从哪个数值开始,此数值是递增的.在此例中index是从1开始的,一次得到9行结果集,则有n_tab(1)到n_tab(9),如果循环再得到新的结果集,则index继续增长n_tab(10)....*/
DBMS_SQL.DEFINE_ARRAY(c, 1, n_tab, 9, indx);
DBMS_SQL.DEFINE_ARRAY(c, 2, n_tab1, 9, indx);
d := DBMS_SQL.EXECUTE(c);
loop
d := DBMS_SQL.FETCH_ROWS(c);
dbms_output.put_line('fetch rows is ' || d);
EXIT WHEN d < 9;
DBMS_SQL.COLUMN_VALUE(c, 1, n_tab);
DBMS_SQL.COLUMN_VALUE(c, 2, n_tab1);
for i in 1 .. d loop
dbms_output.put_line(n_tab(i) || ',' || n_tab1(i));
end loop;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(c);
EXCEPTION
WHEN OTHERS THEN
IF DBMS_SQL.IS_OPEN(c) THEN
DBMS_SQL.CLOSE_CURSOR(c);
END IF;
END;
3.使用variable_value显示DML后的返回结果(单条记录)
以上我们介绍了如何使用DBMS_SQL包来处理数据查询,如果我们把查询语句更换成DML语句,则可以完成各种DML操作。
在PL/SQL中我们可以使用returning方法返回DML操作结果,在DBMS_SQL包中可不可以实现呢?答案当然是可以,用variable_value方法就可以实现。下面就分别用两个例子来展示如何实现,一个是返回单条记录,另一个是返回多条记录。
(1)返回单条记录 procedure single_insert(c1 in number, c2 in number, r out number) is
cursor_name number := dbms_sql.open_cursor;
n number;
begin
dbms_sql.parse(cursor_name,
'insert into demo values (:a,:b) returning :a*:b into :r',
dbms_sql.native);
dbms_sql.bind_variable(cursor_name, 'a', c1);
dbms_sql.bind_variable(cursor_name, 'b', c2);
dbms_sql.bind_variable(cursor_name, 'r', r);
n := dbms_sql.execute(cursor_name);
--使用variable_value函数得到DML操作returning的结果集
dbms_sql.variable_value(cursor_name, 'r', r);
dbms_output.put_line(r);
dbms_sql.close_cursor(cursor_name);
exception
when others then
dbms_sql.close_cursor(cursor_name);
end;
(2)返回多条记录
结合define_array使用,可以更好的完成DML操作。create or replace package DBMS_SQL_DEMO as
procedure multi_insert;
end;
/
create or replace package body DBMS_SQL_DEMO as
procedure multi_insert_priv(c1 in dbms_sql.Number_Table,
c2 in dbms_sql.Number_Table,
r out dbms_sql.Number_Table) is
cursor_name number := dbms_sql.open_cursor;
n number;
begin
dbms_sql.parse(cursor_name,
'insert into demo values (:a,:b) returning :a*:b into :r',
dbms_sql.native);
--使用bind_array函数将number_table类型的变量赋值给绑定变量
dbms_sql.bind_array(cursor_name, 'a', c1);
dbms_sql.bind_array(cursor_name, 'b', c2);
dbms_sql.bind_array(cursor_name, 'r', r);
n := dbms_sql.execute(cursor_name);
--使用variable_value函数将returning的结果集赋值给number_table类型的变量
dbms_sql.variable_value(cursor_name, 'r', r);
dbms_sql.close_cursor(cursor_name);
exception
when others then
dbms_sql.close_cursor(cursor_name);
end;
procedure multi_insert is
c1 dbms_sql.Number_Table;
c2 dbms_sql.Number_Table;
cursor_name number := dbms_sql.open_cursor;
n number;
r dbms_sql.Number_Table;
indx number := 1;
d number;
begin
dbms_sql.parse(cursor_name, 'select * from demo', dbms_sql.native);
dbms_sql.define_array(cursor_name, 1, c1, 5, indx);
dbms_sql.define_array(cursor_name, 2, c2, 5, indx);
n := dbms_sql.execute(cursor_name);
loop
d := dbms_sql.fetch_rows(cursor_name);
exit when d = 0;
dbms_sql.column_value(cursor_name, 1, c1);
dbms_sql.column_value(cursor_name, 2, c2);
multi_insert_priv(c1, c2, r);
for i in 1 .. r.count loop
dbms_output.put_line(r(i));
end loop;
end loop;
exception
when others then
dbms_sql.close_cursor(cursor_name);
end;
end;
/
以上抄袭自:http://space.itpub.net/13129975/viewspace-624522
其他:
http://www.itpub.net/thread-9530-1-1.html
http://blog.csdn.net/fm0517/archive/2009/05/23/4210370.aspx
发表评论
-
查询某个字段都是字母
2017-02-07 14:33 669select * from (select case whe ... -
Oracle的全文检索
2016-08-09 15:43 508Oracle的全文检索,以前用过,效果还可以,就是耗资 ... -
eXtremeDB微秒级实时数据库简介
2011-10-26 13:47 1633eXtremeDB微秒级实时数据库简介 eXtreme ... -
【实践】对于绑定变量看执行计划
2011-05-12 14:41 1493基础: 从Oracle9i,开始的Bind ... -
【技术】执行计划 --- 几种方式
2011-05-12 14:30 1152看Oracle的执行计划: 1. 使用SQL_TRAC ... -
【脚本】trace当前最忙的进程
2011-05-11 15:31 987跟踪当前系统最忙的Oracle进程,生成trace文件, ... -
【技术】执行计划中的一些参数理解
2011-05-10 17:57 1287执行计划出来,有一 ... -
【脚本】获取当前最忙的进程的sql语句
2011-05-10 13:50 1729# # 获取当前最忙进程执行的SQL语句 # ... -
gongzuojilu
2011-05-09 13:10 01. 得出当前最忙客户再做什么 使用说明: ... -
【技术】Oracle跟踪事件的包括那些
2011-05-05 13:41 992以下的文章主要是对Oracle跟踪事件的具体描述, ... -
【技术】一个Oracle巡检工具
2011-05-04 15:32 1991Oracle巡检工具,不错的 -
【技术】找出oracle没有创建索引的外键
2011-05-04 14:59 2303/* Formatted on 2011 ... -
【实践】将无用的索引提取出来
2011-05-03 16:54 1053将无用的索引提取出来: 条件: 1. monitoring ... -
【技术】得到外键对应的索引MatchForeignKeyIndex
2011-05-03 15:27 990Create Or Replace FUNCTIO ... -
【实践】对v$object_usage的内容进行检查(2011.4月份进行统计的)
2011-05-03 15:18 1351重温一下监控的语句: alter inde ... -
SYS_CONTEXT可以获取的一些环境参数
2011-05-03 10:35 1112selectSYS_CONTEXT('USERENV', ... -
[转载]ORACLE中SQL TRACE和TKPROF的使用
2011-04-14 11:01 1390[转载]ORACLE中SQL TRACE和TKPROF的使 ... -
重温Oracle的进程
2011-04-14 09:48 1363在跟踪繁忙Oracle进程时,发现在 user_dump_de ... -
捕获进程在执行的SQL语句
2011-04-13 10:13 1788方法1: 根据服务器processID获取执行的S ... -
索引 -- 检查优化
2011-04-12 14:56 01、 索引的效率: 对索引进行分析: alte ...
相关推荐
在Oracle数据库中,`DBMS_SQL`包是一个功能强大的工具,用于执行动态SQL语句。它提供了处理动态SQL语句的能力,使得开发人员能够灵活地构建和执行SQL语句,而不需要预先定义表结构或SQL文本。`DBMS_SQL`主要通过以下...
需要注意的是,DBMS_SQL包虽然在结构上复杂、使用步骤较多,但掌握其使用对于深入理解动态SQL的实现机制以及维护早期的PL/SQL程序是很有必要的。DBMS_SQL包的使用为Oracle数据库程序开发提供了强大的工具,使得...
在Oracle数据库系统中,DBMS_SQL是一个非常重要的包,它提供了动态执行SQL语句的功能,这对于开发复杂的数据库应用或者需要在运行时构建SQL语句的情况非常有用。DBMS_SQL允许我们处理那些在编译时未知的SQL语句,极...
Oracle数据库系统提供了强大的XML处理能力,这主要体现在其内置的几个PL/SQL包上,如DBMS_XMLDOM、DBMS_XMLPARSER和DBMS_XMLQUERY。这些包为开发者提供了处理XML文档的一整套工具,使得在数据库环境中进行XML数据的...
Oracle 数据库中使用 dbms_stats 包手动收集统计信息 在 Oracle 数据库中,dbms_stats 包提供了一种手动收集统计信息的方式,包括基于表、用户和索引的统计信息。通过使用 dbms_stats 包,我们可以手动收集统计信息...
PLSQL开发过程中动态使用DBMS_SQL 在 PL/SQL 开发过程中,使用 SQL、PL/SQL 可以实现大部分的需求,但是在...通过使用本地动态 SQL 或 DBMS_SQL 包,我们可以在 PL/SQL 中执行动态 SQL 语句,满足复杂的数据库需求。
Oracle数据库系统中,`DBMS_LOB`是一个重要的PL/SQL包,专门用于处理大型对象(LOBs,Large Object)。LOBs是Oracle提供的一种数据类型,用于存储大量数据,如文本、图像、音频或视频文件等。这个包包含了各种过程和...
标题中的问题“ORACLE SYS.DBMS_REGISTRY_SYS has errors”指的是在Oracle数据库系统中,系统包BODY `SYS.DBMS_REGISTRY_SYS` 出现错误,导致了一系列的PL/SQL调用失败。这种错误通常与数据库的元数据注册功能有关,...
通过以上步骤,我们成功地定义了一个可以用于加密和解密的PL/SQL包。此包提供了加密和解密的功能,使得开发者能够在Oracle数据库环境中轻松地保护敏感数据。 ### 总结 DBMS_OBFUSCATION_TOOLKIT为Oracle数据库提供...
在Oracle数据库环境中,`dbms_java`包提供了一系列功能强大的工具,用于管理和控制Java应用程序的安全性。这对于那些在Oracle环境中部署了Java应用程序的企业来说尤为重要。本文将详细介绍如何利用`dbms_java`包来...
在Oracle数据库系统中,`DBMS_RANDOM`是一个非常实用的包,它提供了生成随机数和随机字符串的功能。这个包在各种场景下都有广泛的应用,比如在测试数据的生成、模拟随机行为或者创建伪随机数据时。我们将深入探讨`...
### DBMS_JOB包创建Oracle定时任务详解 在Oracle数据库中,`DBMS_JOB`包提供了一种机制,用于创建和管理后台作业(Job),这些作业可以在特定的时间或按一定的时间间隔执行。这对于需要定期执行的任务非常有用,...
可以通过DBMS_SQLTUNE包创建调优任务,支持针对单个SQL语句或多个SQL语句创建任务。对于多个SQL语句,首先需要创建一个SQL Tuning Set。 - **参数说明**: - `text_of_a_SQL_statement`: SQL语句文本。 - `...
dbms_logmnr 使用 DBMS_LOGMNR 是 Oracle 中的一个日志分析包,用于分析和解释redo日志文件,以便追踪和诊断数据库中的操作。下面是 DBMS_LOGMNR 的使用方法。 首先,需要安装 LogMiner 工具,包括两个脚本 dbmslm...
DBMS_LOCK是Oracle数据库系统中的一个内置包,用于在用户会话之间实现锁的管理,以确保并发操作的安全性和数据一致性。这篇博文深入探讨了DBMS_LOCK的功能、使用方法以及在实际应用中的重要性。 首先,我们要理解...
DBMS_JOB包则是一个PL/SQL包,用于调度和执行数据库中的作业,如定期备份或维护任务。 在上述应用实例中,RMAN被用来做数据库的在线备份,以满足业务连续性的需求。在线备份允许数据库在备份过程中保持开放状态,不...
Oracle系统包是数据库管理系统Oracle中一组预定义的PL/SQL包,它们提供了各种功能,用于数据库管理和维护。本文将详细讲解这些系统包的用途和使用方法。 首先,我们来看dbms_output包,它用于在PL/SQL程序中进行...
"dbms_sql解析器"则提示我们这个系统包含了一个用于解析SQL语句的组件,这是DBMS的重要组成部分,用于理解用户输入的查询并执行相应的操作。"java 实现dbms"明确了整个系统是用Java编程语言实现的。 在描述中,提到...
本项目“dbms.rar”提供了一个自定义实现的DBMS系统,它支持SQL语句的编译和解析,这在理解数据库系统的工作原理和进行数据库相关开发时具有很高的学习价值。 SQL(Structured Query Language)是用于处理关系...