1.创建一个表Test用来测试.
1 CREATE TABLE "TEST"
2 ( "AAA" NUMBER(*,0),3 "BBB" VARCHAR2(10BYTE)4 )
View Code
2.向Test表中插入测试数据
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.执行存储过程
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
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
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();
}
}
}