Oracle之DBMS_SQL包用法详解
对于一般的(select)操作,如果使用动态的sql语句则需要进行以下几个步骤:
open cursor--->parse---> bind variable ---> define column(单条)/define_array(多条) --->excute---> fetch rows---> variable_value ---> close cursor;
对于dml操作(insert,update)则需要进行以下几个步骤:
open cursor--->parse---> bind variable--->execute---> variable_value---> close cursor;
对于(delete)操作只需要进行以下几个步骤:
open cursor--->parse---> bind variable---> execute--->variable_value---> close cursor;
例:
create table cux_demo (a number,b number,c number); begin for i in 1 .. 15 loop insert into cux_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 语句返回某一条记录(一次返回一条记录)。 DECLARE cursor_name INTEGER ; v_sql VARCHAR(200); p_no1 NUMBER := 80; p_no2 NUMBER := 80; v_b1 NUMBER; v_b2 NUMBER; v_b3 NUMBER; row_process INTEGER;BEGIN
v_sql :='select * from cux_demo where a= :ano and b=:bno'; --查询sql语句 cursor_name:= dbms_sql.open_cursor; --打开游标; dbms_sql.parse(cursor_name,v_sql,dbms_sql.native); --解析动态SQL语句; dbms_sql.bind_variable(cursor_name,'ano', p_no1); --绑定输入参数; dbms_sql.bind_variable(cursor_name,'bno', p_no2); --绑定输入参数;
dbms_sql.define_column(cursor_name,1,v_b1); --定义返回列;第二个参数是指需要返回的字段在查询结果中处于第几列,第三个参数就是接收返回结果需要的变量。 dbms_sql.define_column(cursor_name,2,v_b2); dbms_sql.define_column(cursor_name,3,v_b3); row_process := dbms_sql.execute(cursor_name); --执行动态SQL语句 LOOP IF dbms_sql.fetch_rows(cursor_name) > 0 THEN dbms_sql.column_value(cursor_name,1, v_b1); dbms_sql.column_value(cursor_name,2, v_b2); dbms_sql.column_value(cursor_name,3, v_b3); dbms_output.put_line(v_b1 || ';' || v_b2 || ';' || v_b3); ELSE EXIT; END IF; END LOOP;
dbms_sql.close_cursor(cursor_name);
EXCEPTION WHEN OTHERS THEN dbms_sql.close_cursor(cursor_name);END;
2. 使用 define_array 方法一次得到多行查询结果。DECLARE cursor_name INTEGER ; v_sql VARCHAR(200); n_tab1 dbms_sql.number_table; n_tab2 dbms_sql.number_table; indx NUMBER := 1; row_process INTEGER;
BEGIN
v_sql :='select * from cux_demo where rownum<13 order by 1'; --查询sql语句 cursor_name:= dbms_sql.open_cursor; --打开游标; dbms_sql.parse(cursor_name,v_sql,dbms_sql.native); --解析动态SQL语句;
介绍一下define_array函数的 --第一个参数是已经打开的cursor名称, --第二个参数是指需要返回的字段在查询结果中处于第几列; --第三个参数就是接收返回结果需要的变量,与define_column不同的是此变量是table,而不是普通的字段类型; --第四个参数表示一次可以返回的行数; --第五个参数是指n_tab的index从哪个数值开始,此数值是递增的.在此例中index是从1开始的,一次得到9行结果集。 dbms_sql.define_array(c,1,n_tab1,9,indx); dbms_sql.define_array(c,2,n_tab2,9,indx); row_process := dbms_sql.execute(cursor_name); --执行动态SQL语句 LOOP row_process := dbms_sql.fetch_rows(cursor_name); dbms_output.put_line('fetch rows is ' || row_process); EXIT WHEN row_process < 9; dbms_sql.column_value(cursor_name, 1, n_tab1); dbms_sql.column_value(cursor_name, 2, n_tab2); FOR i IN 1 .. row_process LOOP dbms_output.put_line(n_tab(i) || ',' || n_tab1(i)); END LOOP;
END LOOP;
dbms_sql.close_cursor(cursor_name);EXCEPTION WHEN OTHERS THEN dbms_sql.close_cursor(cursor_name);END;
Oracle之DBMS_SQL包用法详解的更多相关文章
- Oracle之UTL_FILE 包用法详解
[转自] http://zhangzhongjie.iteye.com/blog/1903024 UTL_FILE包可以用来读写操作系统上的文本文件,UTL_FILE提供了在客户端(FORM等等)和服 ...
- Oracle之DBMS_LOCK包用法详解
概述与背景 某些并发程序,在高并发的情况下,必须控制好并发请求的运行时间和次序,来保证处理数据的正确性和完整性.对于并发请求的并发控制,EBS系统可以通过Concurrent Program定义界面的 ...
- oracle正则表达式regexp_like的用法详解
oracle正则表达式regexp_like的用法详解 /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与IN ...
- golang格式化输出-fmt包用法详解
golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org 声明: 此片文章并非原创,大多数内容都是来自:https:// ...
- Spring3.0.5jar包用法详解 [转载]
Spring3.X以后jar包进行了重构,取消了原来2.X版本中的总的spring.jar包,而是把总包中的功能全部分开打包.正在向osgi靠拢. 各个jar包详解如下: 1. org.springf ...
- java多线程管理 concurrent包用法详解
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量 ...
- oracle add_months函数的用法详解
如果需要取上一个月的数据,并且每天都要进行此操作,每次都需要改时间,的确非常的麻烦,所以想到了oracle add_months函数这个函数 oracle add_months函数: oracle a ...
- Oracle DECODE函数的用法详解
Oracle DECODE函数使用方法: 1.比较大小select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值sign()函数根据某个值是0. ...
- Oracle Merge Into的用法详解
1. MERGE INTO 的用途 MERGE INTO 是Oracle 9i以后才出现的新的功能.那这个功能 是什么呢? 简单来说,就是:“有则更新,无则插入” ...
随机推荐
- <a>标签点击不跳转
HTML中的<a></a>标签点击不跳转的方法 一.<a href="####" ></a> 使用这个方法我们会发现<a hr ...
- 用find命令查找最近修改过的文件
Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的. 比如按名字查找一个文件,可以用 find / -name targetfilename . 唉,如果只 ...
- Ubuntu下使用tmux实现分屏,以及tmux快捷键
最近用到了终端的复用,使用了tmux,写一下自己的使用和一些快捷键. tmux是指通过一个终端登录远程主机并运行后,在其中可以开启多个控制台的终端复用软件. 来个效果图: 截图我使用的命令是 gno ...
- python 百题计划
一.基础篇 想要像类似执行shell脚本一样执行Python脚本,需要在py文件开头加上什么?KEY:#!/usr/bin/env python Python解释器在加载 .py 文件中的代码时,会对 ...
- hbase_异常_03_java.io.EOFException: Premature EOF: no length prefix available
一.异常现象 更改了hadoop的配置文件:core-site.xml 和 mapred-site.xml 之后,重启hadoop 和 hbase 之后,发现hbase日志中抛出了如下异常: ...
- New Concept English three (47)
Pollution is the price we pay for an overpopulated, over industrialized planet. When you come to thi ...
- MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?
原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...
- [独孤九剑]Oracle知识点梳理(九)数据库常用对象之package
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- 学习动态性能表(22)V$resource_limit
学习动态性能表 第20篇--V$resource_limit 2007.6.15 就一条SQL语句供你参考: select * from V$RESOURCE_LIMIT where resourc ...
- [转] AS3地图拼接与战争迷雾的实现
在开发游戏的过程中,特别是地图编辑器中,需要利用最少的资源,实现最丰富的地形地貌.虽然现在众多的RPG开始使用整图,但是我们偶尔还是需要能够让玩家自己编辑地图,或者其他需要自动进行地图构建的功能.另外 ...