mysql中 out syssys_refcursor_oracle 存储过程返回 结果集 table形式 (使用sys_refcursor 及程序包package 两种方式)...

1.创建一个表Test用来测试.

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 CREATE TABLE "TEST"

2 ( "AAA" NUMBER(*,0),3 "BBB" VARCHAR2(10BYTE)4 )

View Code

2.向Test表中插入测试数据

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 insert into Test values(1,'a');2 insert into Test values(2,'b');3 insert into Test values(3,'c');4 insert into Test values(1,'aaaa');5 insert into Test values(2,'bbbbb');6 insert into Test values(3,'cccccc');

View Code

3.进入主题,创建存储过程

create or replace procedure pro1(

param nvarchar2,

mycur OUT sys_refcursor --游标,用于存储过程中返回结果集

)

as

begin

open mycur for select * from test where AAA=param ;

end;

4.执行存储过程

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 vartype_cur refcursor2 var para nvarchar2(20)3 execute :para :='1';4 exec pro1(:para,:type_cur);5 print type_cur;

View Code

5.使用程序包package创建存储过程 返回table

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 create or replace package pkg_HelloWorld as

2 type myrctype is ref cursor; --定义游标类型3 procedure getHelloWorld (param nvarchar2,rst out myrctype); --创建存储过程声明,注:必须与程序包体中的存储过程头相同4 end pkg_HelloWorld;

View Code

6.创建package body包体

create or replace package body pkg_HelloWorld asprocedure getHelloWorld(param nvarchar2,rstout myrctype) --注:必须与包声明中相同asbegin

open rstfor

select * from test where AAA=param;

end getHelloWorld;

end pkg_HelloWorld;

7.调用 使用包,返回table

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

vartype_cur refcursorvar para nvarchar2(20)

execute :para :='1';

exec PKG_HELLOWORLD.getHelloWorld(:para,:type_cur);

print type_cur;

View Code

=========================================================================

来自:http://blog.itpub.net/12639172/viewspace-564910/

Asp.Net 访问Oracle的简单例子

1.为灵活设置,将连接字符写在web.config文件中

appSettings>

字串说明:

需要定义Net服务: 注意:这种连接方法可能会出现权限问题请参考 我的另一篇随笔解决“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本。”(图)

无需定义Net服务: 注意: 这种方法有一个问题是,无法想上面的服务那样一次定义服务,在服务下面再定义多个连接

2.为Web 应用程序 添加 System.Data.OracleClient 程序集引用

3.下面是测试的程序

aspx 文件代码如下:

1

2

3

4

5

6

title>

7

8

9

10

11

12 调用一个Oracle连接并执行一条语句测试是否成功asp:Label>

13

14

15

16

17 调用给SQL语句执行绑定

18

19 asp:GridView>

20

21

22

23

24 输入输出参数的存储过程调用

25 asp:TextBox>

26

27

28

29

30 执行返回数据集的Oracle存储过程

31

32 asp:GridView>

33

34 p>

35 < /div>

36

37

38

aspx.cs 文件代码如下:

1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.Linq;4 usingSystem.Web;5 usingSystem.Web.UI;6 usingSystem.Web.UI.WebControls;7 usingSystem.Data.SqlClient;8 usingSystem.Data.OracleClient;9

10 namespaceAspNetOra11 {12 public partial class_Default : System.Web.UI.Page13 {14 System.Data.OracleClient.OracleConnection objConn; //声明一个OracleConnection对象

15

16 System.Data.OracleClient.OracleCommand objCmd; //声明一个OracleCommand对象

17

18 string strcon = System.Configuration.ConfigurationManager.AppSettings["oracleconn"]; //从Web.config 文件里调用数据库连接字符串

19

20 protected void Page_Load(objectsender, EventArgs e)21 {22

23 }24 ///

25

26 ///测试连接27 ///

28

29 ///

30 ///

31 protected void Button1_Click(objectsender, EventArgs e)32 {33 try

34 {35 bjConn = new OracleConnection(strcon); //用连接字符串,实例化连接对象

36

37 objConn.Open(); //打开数据库连接

38

39 string strSQL = "select * from sys.test1"; //查询sys建立的test1表的内容 因为我现在用的登录用户不是sys了

40

41 objCmd = new OracleCommand(strSQL, objConn); //用命令和连接对象建立命令实例

42

43 objCmd.ExecuteNonQuery();44

45 objConn.Close();46

47 this.Label1.Text = "成功";48

49 }50 catch

51 {52 this.Label1.Text = "失败";53 }54

55

56 }57

58 ///

59

60 ///执行SQL 语句返回数据集合61 ///

62

63 ///

64 ///

65 protected void Button2_Click(objectsender, EventArgs e)66 {67 bjConn = new OracleConnection(strcon); //用连接字符串,实例化连接对象

68

69 objConn.Open(); //打开数据库连接

70

71 System.Data.OracleClient.OracleDataAdapter adapter = new OracleDataAdapter("select * from sys.test1", objConn);72

73 System.Data.DataSet ds = newSystem.Data.DataSet();74

75 adapter.Fill(ds);76

77 GridView1.DataSource = ds.Tables[0].DefaultView;78

79 GridView1.DataBind();80

81 }82

83 ///

84

85 ///存储过程输入、输出参数86 ///

87 ///存储过程定义如下:88 ///

89 ///create or replace procedure getName(name_out out varchar2 ,id_in in varchar2) is90 ///begin91 ///select NAME into name_out from test1 where id = id_in;92 ///end getName;93 ///

94 ///

95

96 ///

97 ///

98 protected void Button3_Click(objectsender, EventArgs e)99 {100 bjConn = new OracleConnection(strcon); //用连接字符串,实例化连接对象

101

102 objConn.Open(); //打开数据库连接

103

104 OracleCommand cmd = new OracleCommand("getName", objConn);105

106 cmd.CommandType =System.Data.CommandType.StoredProcedure;107

108 cmd.Parameters.Add("name_out", OracleType.VarChar, 20); //输出参数,注意名字要与存储过程一致

109

110 cmd.Parameters["name_out"].Direction =System.Data.ParameterDirection.Output;111

112 cmd.Parameters.Add("id_in", OracleType.VarChar, 20); //输入参数,注意名字要与存储过程一致

113

114 cmd.Parameters["id_in"].Direction =System.Data.ParameterDirection.Input;115

116 cmd.Parameters["id_in"].Value = "1"; //给输入参数赋值

117

118 cmd.ExecuteNonQuery();119

120 this.TextBox1.Text = cmd.Parameters["name_out"].Value.ToString(); //获得输出参数

121

122

123 }124

125 ///

126

127 ///Oracle存储过程并不直接返回记录集,记录集以游标的形式通过参数返回。一个包(Packages可以包含多个存储过程,128 ///访问存储过程时采用“包名.存储过程名”的方式。129 ///存储过程是我上一个随笔写的Test,但是上一个存储过程是用Sys建立的,在这里我又重新用当前用户建立的一个属于这个用户的包130 ///

131 ///包定义如下:132 ///包头:133 ///create or replace package test is134

135 ///TYPE MYCURSOR IS REF CURSOR;136 ///PROCEDURE GETLIST(cur_OUT OUT MYCURSOR);137

138 ///end test;139 ///

140 ///

141 ///

142 ///包体:143 ///create or replace package body test is144

145 ///PROCEDURE GETLIST(cur_OUT OUT MYCURSOR) AS146 ///BEGIN147 ///OPEN cur_OUT FOR SELECT * FROM test1;148 ///END;149

150 ///end test;151 ///

152 ///

153 ///

154 ///

155 ///

156 ///

157

158 ///

159 ///

160 protected void Button4_Click(objectsender, EventArgs e)161 {162 bjConn = new OracleConnection(strcon); //用连接字符串,实例化连接对象

163

164 objConn.Open(); //打开数据库连接

165

166 OracleCommand cmd = new OracleCommand("test.GETLIST", objConn);167

168 cmd.Parameters.Add("cur_OUT", OracleType.Cursor); //注意这里的类型

169

170 cmd.Parameters["cur_OUT"].Direction =System.Data.ParameterDirection.Output;171

172 cmd.CommandType =System.Data.CommandType.StoredProcedure;173

174 OracleDataAdapter da = newOracleDataAdapter(cmd);175

176 System.Data.DataSet ds = newSystem.Data.DataSet();177

178 da.Fill(ds);179

180 GridView2.DataSource = ds.Tables[0].DefaultView;181

182 GridView2.DataBind();183

184

185 }186 }187 }

========================================================================

这句话很重要,是使用oralce存储过程绑定gridview的关键->

Oracle存储过程并不直接返回记录集,记录集以游标的形式通过参数返回。一个包(Packages可以包含多个存储过程,访问存储过程时采用“包名.存储过程名”的方式。

也可以使用我刚才上面介绍的那种方式,直接使用存储过程返回sys_cursor。直接使用存储过程sys_cursor与使用Package返回sys_cursor的使用方法完全一样,唯一不同的是调用时的语法略有差异。下面用C#代码写出来,可以与上面的做一下对比。

using (OracleConnection oraConn = new OracleConnection(DbFactory.GetConnStr(DataBase.Oracle, "192.168.0.1", "test", "1", "1")))

{using (OracleCommand cmd = new OracleCommand("testProc2", oraConn))//只有这里有一点点区别

{

cmd.CommandType=System.Data.CommandType.StoredProcedure;

cmd.Parameters.Add("cur_out", OracleDbType.RefCursor);

cmd.Parameters["cur_out"].Direction =System.Data.ParameterDirection.Output;using (OracleDataAdapter oraDa = newOracleDataAdapter(cmd))

{

DataSet ds= newDataSet();

oraDa.Fill(ds);

GridView1.DataSource= ds.Tables[0];

GridView1.DataBind();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值