对于一般的(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包用法详解的更多相关文章

  1. Oracle之UTL_FILE 包用法详解

    [转自] http://zhangzhongjie.iteye.com/blog/1903024 UTL_FILE包可以用来读写操作系统上的文本文件,UTL_FILE提供了在客户端(FORM等等)和服 ...

  2. Oracle之DBMS_LOCK包用法详解

    概述与背景 某些并发程序,在高并发的情况下,必须控制好并发请求的运行时间和次序,来保证处理数据的正确性和完整性.对于并发请求的并发控制,EBS系统可以通过Concurrent Program定义界面的 ...

  3. oracle正则表达式regexp_like的用法详解

    oracle正则表达式regexp_like的用法详解 /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与IN ...

  4. golang格式化输出-fmt包用法详解

    golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org    声明: 此片文章并非原创,大多数内容都是来自:https:// ...

  5. Spring3.0.5jar包用法详解 [转载]

    Spring3.X以后jar包进行了重构,取消了原来2.X版本中的总的spring.jar包,而是把总包中的功能全部分开打包.正在向osgi靠拢. 各个jar包详解如下: 1. org.springf ...

  6. java多线程管理 concurrent包用法详解

        我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量 ...

  7. oracle add_months函数的用法详解

    如果需要取上一个月的数据,并且每天都要进行此操作,每次都需要改时间,的确非常的麻烦,所以想到了oracle add_months函数这个函数 oracle add_months函数: oracle a ...

  8. Oracle DECODE函数的用法详解

    Oracle DECODE函数使用方法: 1.比较大小select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值sign()函数根据某个值是0. ...

  9. Oracle Merge Into的用法详解

    1.    MERGE INTO 的用途         MERGE INTO 是Oracle 9i以后才出现的新的功能.那这个功能 是什么呢?         简单来说,就是:“有则更新,无则插入” ...

随机推荐

  1. Microsoft SQL Server for Linux安装和配置

    虽说mssql for linux早已经出来了,但原本没有打算这么早就去尝试的,无奈之下还是得先尝试用了,这里分几篇介绍我在用mssql for linux时遇到的问题,不得不说作为先吃螃蟹的人总是要 ...

  2. Hash Join 一定是选择小表作为驱动表吗

    原来自己也是一直认为oralce会选择小表作为驱动表,以前一直也没注意,今天看了落落大神的实验,才发现,oralce查询时不一定选择小表作为驱动表. 如果对大表增加了约束,大表也会作为驱动表. 实验见 ...

  3. 【WPF】DataGrid的Row样式设置

    引言      在与DataGrid相关的项目中,会有一个比较常见的需求.那就是在根据数据设置行的样式,例如行的背景色或者字体色.我们用到的方法有几个,下面一个个说来. 准备工作     介绍方法之前 ...

  4. 前端 jQuery副本

    jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交互, ...

  5. 《精通.NET企业项目开发》 - 书摘精要

    (P7) 处于任何逻辑层面上的类,对于同一层面上的其他类应该是可重用的:对于在同等范围内其他所有需要该数据的类而言,提供数据的类应该是可以被调用的: (P9) 大多数企业系统都是用平台无关的技术构建的 ...

  6. 浅学soap--------2

    使用wsdl文件: 生成wsdl <?php require('person.class.php'); // 引入生成wsdl的类文件 require('SoapDiscovery.class. ...

  7. boost开发指南

    C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost很复杂,感觉某些地方有过度设计和太过于就事论事的嫌疑,对实际开发工作的考虑太过于理想化.学习boost本身就是一个复杂度,有 ...

  8. C#异步编程(四)混合模式线程同步

    之前讨论了基元用户模式和内核模式线程同步构造.其他所有线程同步构造都基于它们,而且一般都合并了用户模式和内核模式构造,我们称为混合线程同步构造.没有线程竞争时,混合构造提供了基元用户模式构造所具有的性 ...

  9. ProjectEuler654

    我,ycl:BM是什么早就忘了! 毕老爷:那你们可以做一做这道题练练BM板子啊. 传送门 //Achen #include<bits/stdc++.h> #define For(i,a,b ...

  10. 页面报错Uncaught SyntaxError: Unexpected identifier

    错误描述:未捕获的语法错误:意想不到的标识符. 如图所示:检查之后发现是页面js内缺少“,”引起的.添加之后就OK了.