1.創建一個表Test用來測試.

1 CREATE TABLE "TEST" 2 ( "AAA" NUMBER(*,0), 3 "BBB" VARCHAR2(10 BYTE) 4 )
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');
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 var type_cur refcursor 2 var para nvarchar2(20) 3 execute :para :='1'; 4 exec pro1(:para,:type_cur); 5 print type_cur;
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;
6.創建package body包體
create or replace package body pkg_HelloWorld as procedure getHelloWorld(param nvarchar2,rst out myrctype) --注:必須與包聲明中相同 as begin open rst for select * from test where AAA=param; end getHelloWorld; end pkg_HelloWorld;
7.調用 使用包,返回table

var type_cur refcursor var para nvarchar2(20) execute :para :='1'; exec PKG_HELLOWORLD.getHelloWorld(:para,:type_cur); print type_cur;
=========================================================================
來自:http://blog.itpub.net/12639172/viewspace-564910/
Asp.Net 訪問Oracle的簡單例子
1.為靈活設置,將連接字符寫在web.config文件中
<appSettings> <add key="oracleconn" value="User ID=terryfeng;Password=frt_2007;Data Source=test;"/>
<add key="oracleconn" value="User ID=terryfeng;Password=frt_2007;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST=192.168.1.200)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=test.finemoon)))" /> appSettings>
字串說明:
需要定義Net服務: <add key="參數名" value="User ID=用戶名;Password=用戶密碼;Data Source=數據源;"/> 注意:這種連接方法可能會出現權限問題請參考 我的另一篇隨筆解決“System.Data.OracleClient 需要 Oracle 客戶端軟件 8.1.7 或更高版本。”(圖)
無需定義Net服務: <add key="參數名" value="User ID=用戶名;Password=用戶密碼;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = 協議)(HOST=主機)(PORT=端口)))(CONNECT_DATA=(SERVICE_NAME=服務名)))" /> 注意: 這種方法有一個問題是,無法想上面的服務那樣一次定義服務,在服務下面再定義多個連接
2.為Web 應用程序 添加 System.Data.OracleClient 程序集引用
3.下面是測試的程序
aspx 文件代碼如下:
1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AspNetOra._Default" %> 2 3 <DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4 <html xmlns="http://www.w3.org/1999/xhtml"> 5 <head runat="server"> 6 <title>title> 7 </head> 8 <body> 9 <form. id="form2" runat="server"> 10 <div> 11 <p> 12 調用一個Oracle連接並執行一條語句測試是否成功<asp:Label ID="Label1" runat="server" ForeColor="Red" Text="">asp:Label> 13 <br /> 14 <asp:Button ID="Button2" runat="server" OnClick="Button1_Click" Text="測試連接是否成功" /> 15 </p> 16 <p> 17 調用給SQL語句執行綁定<br /> 18 <asp:GridView ID="GridView2" runat="server"> 19 asp:GridView> 20 <br /> 21 <asp:Button ID="Button3" runat="server" OnClick="Button2_Click" Text="返回數據集合,綁定Gridview" /> 22 </p> 23 <p> 24 輸入輸出參數的存儲過程調用<br /> 25 <asp:TextBox ID="TextBox1" runat="server">asp:TextBox> 26 <br /> 27 <asp:Button ID="Button4" runat="server" Text="z輸入輸出參數的存儲過程" OnClick="Button3_Click" /> 28 </p> 29 <p> 30 執行返回數據集的Oracle存儲過程<br /> 31 <asp:GridView ID="GridView3" runat="server"> 32 asp:GridView> 33 <asp:Button ID="Button5" runat="server" Text="執行存儲過程返回數據集" OnClick="Button4_Click" /> 34 </ p> 35 < /div> 36 <form> 37 <body> 38 <html>
aspx.cs 文件代碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 using System.Data.SqlClient; 8 using System.Data.OracleClient; 9 10 namespace AspNetOra 11 { 12 public partial class _Default : System.Web.UI.Page 13 { 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(object sender, EventArgs e) 21 { 22 23 } 24 /// 25 26 /// 測試連接 27 /// 28 29 /// 30 /// 31 protected void Button1_Click(object sender, 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(object sender, 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 = new System.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) is 90 /// begin 91 /// select NAME into name_out from test1 where id = id_in; 92 /// end getName; 93 /// 94 /// 95 96 /// 97 /// 98 protected void Button3_Click(object sender, 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 is 134 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 is 144 145 /// PROCEDURE GETLIST(cur_OUT OUT MYCURSOR) AS 146 /// BEGIN 147 /// 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(object sender, 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 = new OracleDataAdapter(cmd); 175 176 System.Data.DataSet ds = new System.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 = new OracleDataAdapter(cmd)) { DataSet ds = new DataSet(); oraDa.Fill(ds); GridView1.DataSource = ds.Tables[0]; GridView1.DataBind(); } } }