Oracle 10g Release2新功能之Ref Cursor

zjttouzi2

zjttouzi2

2016-02-19 16:49

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的Oracle 10g Release2新功能之Ref Cursor教程,一起来看看吧!超容易上手~
Ref Cursor就是我们定义在服务器端的结果集的reference。 当我们打开一个Ref Cursor的时候,没有任何的数据返回到客户端,相反,数据在服务器上的地址将会被返回到客户端。这样用户就可以自己决定什么时间和以那种方式通过Ref Cursor去取数据。 
  在以前版本的ODP.NET中,我们可以通过Ref Cursor取数据,但是我们不能把Ref Cursor作为一个Input参数传递给PL/SQL的存储过程和存储函数。但是在Oracle Database 10g Release2,我们能够很简单的把Ref Cursor作为Input参数传递给PL/SQL的存储过程和存储函数。这是Oracle Database 10g Release2的新功能。
  我们接下来就以例程的方式来向你介绍这个新功能。
  准备数据库
  我们要在数据库中生成一个表和一个包,我们接下来的例子会用到。 
  请用HR用户登录数据库,然后运行下面的脚本。
create table processing_result
(
 status varchar2(64)
);
create or replace package cursor_in_out as
type emp_cur_type is ref cursor return employees%rowtype;
procedure process_cursor(p_cursor in emp_cur_type);
end;
/
create or replace package body cursor_in_out as
procedure process_cursor(p_cursor in emp_cur_type) is
employee employees%rowtype;
begin
 loop
  fetch p_cursor into employee;
  exit when p_cursor%notfound;
  insert into processing_result
  values('Processed employee #' ||
  employee.employee_id || ': ' ||
  employee.first_name || ' ' ||
  employee.last_name);
 end loop;
end;
end;
/
  创建.NET代码
  数据库已经准备好了,接下来我们就准备创建.NET代码。
using System;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
namespace CursorInCursorOut
{
 /// summary
 /// Summary description for Class1.
 /// /summary
 class Class1
 {
  /// summary
  /// The main entry point for the application.
  /// /summary
  [STAThread]
  static void Main(string[] args)
  {
   // create connection to database
   // change for your environment
   string constr = "User Id=hr; Password=hr; Data Source=oramag; Pooling=false";
   OracleConnection con = new OracleConnection(constr);
   con.Open();
   // command and parameter objects to get ref cursor
   OracleCommand cmd = con.CreateCommand();
   cmd.CommandText = "begin open :1 for select * from employees where manager_id=101; end;";
   OracleParameter p_rc = cmd.Parameters.Add("p_rc", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output);
  // get the ref cursor
  cmd.ExecuteNonQuery();
  // clear parameters to reuse
  cmd.Parameters.Clear();
  // command and parameter objects to pass ref cursor
  // as an input parameter
  cmd.CommandText = "cursor_in_out.process_cursor";
  cmd.CommandType = CommandType.StoredProcedure;
  OracleParameter p_input = cmd.Parameters.Add("p_input", OracleDbType.RefCursor, p_rc.Value,  ParameterDirection.Input);
  // process the input cursor
  cmd.ExecuteNonQuery();
  // clean up objects
  p_input.Dispose();
  p_rc.Dispose();
  cmd.Dispose();
  con.Dispose();
 }
}
}

  运行上面的代码,这个程序本身没有输出,但是我们可以通过SQL*PLUS很容易可以看到下面的输出。
SQL select * from processing_result;
STATUS
----------------------------------------
Processed employee #108: Nancy Greenberg
Processed employee #200: Jennifer Whalen
Processed employee #203: Susan Mavris
Processed employee #204: Hermann Baer
Processed employee #205: Shelley Higgins
5 rows selected.
  我这里只是给大家一个很简单的例子,希望大家充分应用Oracle Database的新特性,使你的项目更加的稳定,效率更高。
展开更多 50%)
分享

猜你喜欢

Oracle 10g Release2新功能之Ref Cursor

编程语言 网络编程
Oracle 10g Release2新功能之Ref Cursor

Oracle 10g Release2新功能之变化通知

编程语言 网络编程
Oracle 10g Release2新功能之变化通知

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

oracle 10g常见问题精选 (2)

编程语言 网络编程
oracle 10g常见问题精选 (2)

Oracle 10g学习之数据库恢复

编程语言 网络编程
Oracle 10g学习之数据库恢复

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

不要忽视Oracle 10g STATSPACK

编程语言 网络编程
不要忽视Oracle 10g STATSPACK

ORACLE 10g 安装教程[图文]

编程语言 网络编程
ORACLE 10g 安装教程[图文]

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

用Oracle并行查询发挥多CPU的威力

用Oracle并行查询发挥多CPU的威力

用 PHP 实现通过 Web 执行 C/C++ 程序

用 PHP 实现通过 Web 执行 C/C++ 程序
下拉加载更多内容 ↓