在oracle塊程式設計(begin系列)中,由於其不支援select .... from ...返回結果集的形式,因此就只能通過輸出引數的形式返回結果。游標作為一種將結果集封裝成以指標單調向下讀取資料的結構,類似於只有出隊並刪除操作的佇列,正好作為輸出引數的型別。而為了使用這種方式,必須保證儲存過程的引數在宣告與呼叫時的統一,因此不得不使用程式包。所以程式包+游標+儲存過程或函式就成了塊程式設計返回結果集的方法。下面來談pl/sql與odp.net實現的方法。
create table grade
( gradeid,number,
gradename varchar2(20)
)
--定義程式包規範
create package grades is
type result is ref cursor;
procedure fenye_grade(p_pagesize in number,p_pageindex in number,p_result out result);
end grades;
--定義程式包體
create package body grades is
procedure fenye_grade(p_pagesize in number,p_pageindex in number,p_result out result) is
begin
open p_result for select gradeid,gradename
from (select gradeid,gradename,rownum rn from grade where rownum<=p_page*p_pagesize) a
where rn>p_pagesize*(p_page-1);
end fenye_
a、改為"where rownum>p_pagesize*(p_page-1)"
這樣改後,結果一定是空的,為什麼呢?用rownum判斷就意味著又要對a結果集重新編號了,根據上面的推論,結果一定是空的。那用rn為什 麼又可以呢?rn是a結果集rownum的別名,當把rownum用別名輸出後,就等於rownum物化了,已經作為結果集的一列,因此用rn判斷時就不要重新編號了
declare
pagesize number :=3;
page number :=2;
indexx number:=0;
result grades.result;
grad grade%rowtype;
begin
loop
fetch result into grad;
dbms_output.putline(grad.gradename);
indexx:=indexx+1;
exit when indexx
注意:1.不能有游標的%notfount屬性做判斷,因為引用游標型別不支援。
2、沒法用for 游標,也不支援.
using oracle.dataaccess.client;
using oracle.dataaccess.types;
oracleconnection conn=new oracleconnection("連線字串");
oraclecommand cmd=new oraclecommand("fenye_grade",conn);
oracleparameter re=new oracleparameter(":result",oracledbtype.refcursor);
re.direction=parameterdirection.output;
cmd.parameters.add(new oracleparameter(":p_pagesize",3));
cmd.parameters.add(new oracleparameter(":p_page",2));
cmd.parameters.add(re);
conn.open();
cmd.executenonquery();
oracledatareader read=(re.value as oraclerefcursor).getdatareader();
//讀資料
//......
read.close();
conn.close();
oracle中的游標型別由odp.net中的oraclerefcursor類和oracledataadapter類解析,用oraclerefcursor的getdatareader()可以獲得oracledatareader。用oracledataadapter解析,在呼叫fill()方法時,該類會將輸出的游標對應為一張 張datatable.當只有乙個輸出游標時,如上面的**例項,可以直接用oraclecommand的excutereader()獲得oracledatareader。函式返回游標與儲存過程返回接收一樣。
講到這裡,再講講adp.net裡的多行插入吧,這和插入到sql server中有點不同。
2.1、多行插入.
利用ado.net向sql server插入多行資料,有兩種方法:1.拼乙個insert into字串集執行.2、利用dataset做fill或批處理.而在odp.net,也有兩種便捷的方法:1.拼insert into集,但要注意,不能純是"inert into ...;insert into",必須要用 begin end包起來才能成功提交。2、便捷高效的批處理:
using oracle.dataaccess.client;
using oracle.dataaccess.types;
int gradeids=;
string gradenames=;
oracleconnection conn=new oracleconnection("連線字串");
oraclecommand cmd=new oraclecommand("insert into grade values(:gradeid,:gradename)",conn);
oracleparameter re=new oracleparameter(":gradeid",oracledbtype.int32);
re.value=gradeids;
oracleparameter name=new oracleparameter(":gradename",oracledbtype.varchar2);
name.value=gradenames;
cmd.parameters.add(re);
cmd.parameters.add(name);
cmd.arraybindcount=gradeids.length;//批處理量
conn.open();
int count=cmd.executenonquery();
conn.close();
Oracle 儲存過程返回結果集
oracle 儲存過程返回結果集 1.返回陣列 在oracle後台建立乙個程式包或者儲存過程 connect scott tiger create or replace package ado callpkg as type eid is table of number 4 index by bin...
oracle 返回結果集的方法
oracle返回結果集 過程返回記錄集 create or replace package pkg test as type myrctype is ref cursor procedure get p id number,p rc out myrctype end pkg test create ...
oracle 儲存過程返回結果集
好久沒上來了,難道今天工作時間稍有空閒,研究了一下oracle儲存過程返回結果集.配合oracle臨時表,使用儲存過程來返回結果集的資料讀取方式可以解決海量資料表與其他表的連線問題.在儲存過程中先根據過濾條件從海量資料表中選出符合條件的記錄並存放到臨時中,可以通過乙個檢視將臨時表與其他相關表連線起來...