javascript和JQuery焦点图和代码特效大全
当前最流行的开源CMS网站系统大全
当前位置:主页 > 数据库 > Oracle >

Oracle 10g Release2新功能之Ref Cursor

来源:编辑:发布于:2011-01-06人围观

  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的新特性,使你的项目更加的稳定,效率更高。

与相关的文章
有时间的话来看看IT界的突发事件