當前位置:首頁 » 存儲配置 » oracle存儲過程返回數據集

oracle存儲過程返回數據集

發布時間: 2022-05-10 07:27:46

Ⅰ Oracle存儲過程返回記錄集

declare
begin
for a in(select s.stuid,s.stuname,s.stusex,c.classnum,c.classname ,r.sturesults tmp from student s
left join result r on s.stuid=r.stuid
left join calss c on r.classnum=c.classnum
)
case when a.tmp>90 then
你要執行的操作;
case when a.tmp>60 and a.tmp<90 then
你要執行的操作;
case when a.tmp<60 then
你要執行的操作;
else
end case;
end;

Ⅱ 如何在Delphi中調用oracle的存儲過程返回數據集

【delphi+oracle報表解決方案(一)】delphi中調用oracle的存儲過程(分帶返回遊標,不返回值兩種)
關鍵字: delphi ,oracle存儲過程,游標,返回數據集,報表
註:delphi 6+ oracle 8.1.6
一.創建包與包體
1.附:建表aaclass為下面作測試用
create table aaclass(CID VARCHAR2(50), CNAME VARCHAR2(50), pnumber NUMBER(10,0) );
INSERT INTO aaclass values('c1', 'cn1', 10 ) ;
INSERT INTO aaclass values('c2', 'cn2', 40 ) ;
INSERT INTO aaclass values('c1', 'cn3', 30 ) ;
commit;
2.建包:
CREATE OR REPLACE PACKAGE PKG_JCCTEST1
AS
type rc_class is ref cursor;

--求p1,p2的和與差,返回的多個值通過游標返回
procere GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class);

--查詢滿足條件的數據集,返回數據集通過游標返回
procere GetClass2(a in number,ResultCursor out rc_class ) ;
--往表中插一條記錄,不返回結果集時,本人用AdoQuery調用(adodataset好象要求必須返回結果集)
procere InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number) ;
end PKG_JCCTEST1;

3.建包體
CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1
AS
procere GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class)
IS
BEGIN
open ResultCursor for
select p1-p2 as "sum", p1+p2 as "sub" from al;
END ;

procere GetClass2(a in number,ResultCursor out rc_class )
is
begin
open ResultCursor for
select aaclass.* from aaclass where pnumber >a;
end ;
procere InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number)
is
begin
insert into aaclass values(p_cid,p_cname,p_pnumber) ;
-- commit;
end ;

二.在delphi中利用AdoDataSet調用上述第一個存儲過程
1.利用AdoConnection1連接資料庫(驅動為 oracle Provider for OLE DB),
**並在連接字元串中加入這一節: PLsqlRSet=1; 如下所示:
Provider=OraOLEDB.Oracle.1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=1
2.在窗體上加AdoDataSet1 指明連接為上述AdoConnection1,下面可以放一個按鈕,單擊按鈕就能調用第一步中創建的包過程,並返回數據集。代碼如下所示:

procere TForm1.Button1Click(Sender: TObject);
var
AResult , BResult : integer;
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ;
//***利用call方法調用oracle過程時,參數必須由?來傳, 即使你要傳的參數為常理
//輸出遊標的參數不需要指定!!!!!!,本來此函數帶三個參數,我們這里只需要傳兩個參數.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetSubAndSum2(?,?)}' ;
//***C 順序有關,createparam必須放在commandtext賦值語句之後.
// 創建第一個參數,對應call中的第一個?,ftinteger為類型,10為長度,45為傳入的實參值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,45);
//創建第二個參數,根據createparameter的順序 自動與call中的第二個參數對應
ADODataSet1.Parameters.CreateParameter('p2',ftinteger,pdinput,10,4);
//下面調用ADODataSet1 的open方法,返回數據集(對應包過程的游標)
ADODataSet1.Open ;
//根據存儲過程,數據集只有一條記錄,所以不需要用while do 來遍歷數據集,直接取數據了
//此處的欄位名根據包過程中的返回遊標 對應的欄位名來取
//定義的存儲過程返回遊標如: open ResultCursor for
// select p1-p2 as "sum", p1+p2 as "sub" from al;
//把對應的欄位值取出來即可
AResult := ADODataSet1.Fields.FieldByName('sub').Value ;
BResult := ADODataSet1.Fields.FieldByName('sum').Value ;
//顯示結果
showmessage(inttostr(AResult)) ;
showmessage(inttostr(BResult)) ;
end;

三.在delphi中利用AdoDataSet調用上述第二個存儲過程

還是利用上述的AdoDataSet1來調用第二個存儲過程,無需任何改動,加第二個按鈕,單擊時代碼如下:
procere TForm1.Button2Click(Sender: TObject);
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ;
//***利用call方法調用oracle過程時,參數必須由?來傳, 即使你要傳的參數為常理
//輸出遊標的參數不需要指定!!!!!!,本來此函數帶兩個參數,我們這里只需要傳一個參數.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetClass2(?)}' ;
//***C 順序有關,createparam必須放在commandtext賦值語句之後.
// 創建第一個參數,對應call中的第一個?,ftinteger為類型,10為長度,20為傳入的實參值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,20);

//下面調用ADODataSet1 的open方法,返回數據集(對應包過程的游標)
ADODataSet1.Open ;
while not ADODataSet1.Eof do
begin
showmessage('CID : '+string(ADODataSet1.FieldByName('CID').Value) +
'--CNAME :' + string(ADODataSet1.FieldByName('CNAME').Value) +
'--PNUMBER :' + string(ADODataSet1.FieldByName('PNUMBER').Value)
) ;
ADODataSet1.Next ;
end ;
end;

四 利用adoquery調用第三個過程,不返回數據集的
procere TForm1.Button3Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ;
AdoQuery1.SQL.Clear ;
AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftstring,pdinput, 50,'c11') ;
AdoQuery1.Parameters.CreateParameter('P2',ftstring,pdinput, 50,'cn11') ;
AdoQuery1.Parameters.CreateParameter('P3',ftinteger,pdinput, 50,25) ;
AdoQuery1.ExecSQL ;
end;

五 利用adoquery調用第一個過程,返回數據集的.

procere TForm1.Button4Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ;
AdoQuery1.SQL.Clear ;
AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftinteger,pdinput, 50,25) ;
AdoQuery1.Parameters.CreateParameter('P2',ftinteger,pdinput, 50,22) ;
AdoQuery1.Open ;
Showmessage(string( AdoQuery1.FieldByName('sub').Value)+'-'+
string( AdoQuery1.FieldByName('sum').Value));
end;
六.關於三層體系的此類問題
兩層的解決了,三層類似.
中間層用tadodataset 或tadoquery (+tdatasetprovider),中間層的adoconnection的連接字元串加上plsqlRset=1;
客戶端用clientdataset ,大同小異,舉例如下:
begin
//調用相應的過程
ClientDataSet1.Close ;
ClientDataSet1.Params.Clear ;
ClientDataSet1.CommandText := '{call PackageName.ProcereName(?,?)}' ;
ClientDataSet1.Params.CreateParam(ftInteger , 'ParamName1', ptInput) ;
ClientDataSet1.Open ;

end ;

本人水平有限,如有不當與錯誤之處請指正!

--------------------------------------------------
問:你好:
看到你的關於DELPHI調用ORACLE存儲過程返回結果集的文章,很受觸發。
我已經實現了在DELPHI里調用ORACLE存儲過程,通過一個游標參數,返回一個結果集的情況。現在有個問題:在存儲過程里,可以實現多個弱游標參數輸出多個結果集,但是,在DELPHI里,我不知道,怎麼取得這第二個或其後的通過游標返回的結果集。通過ADO只能取得第一個結果集。

如果你知道解決方案,請EMAIL聯系我。
不勝感激。
答:
用nextrecordset方法就可以了,代碼如下:
var
vTemp1:integer;
begin
....
ADODataSet1.Open;
ADODataSet2.Recordset:=ADODataSet1.NextRecordset(vTemp1);
showmessage(ADODataSet2.FieldValues['CID']);
end;

問:怎麼連接區域網內的oracle的數據呢?
連接字元串應該怎麼寫呢?
Provider=OraOLEDB.Oracle.1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=1
我用的adoquery控制項。
答:以下三個參數根據你的情況修改就可以了
Data Source=TNS名稱
User ID=用戶名
Password=密碼
本文來自CSDN博客

Ⅲ oracle 通過調用存儲過程,得到數據集

我也是初學者,不是什麼高手,根據我的理解提出我的看法,僅供參考:
(1)函數function的參數必須都是in類型的,必須要有返回值
它可以被sql語句或者存儲過程調用
例如:
--定義一個函數,返回傳入的參數本身
create or replace function TestFunOne(argsOne in varchar2) return varchar2 is
resultStr varchar2(500);
begin
resultStr := argsOne;
return(resultStr);
end TestFunOne;

sql語句中可以這樣用: update tableName t set t.columnName = TestFunOne('1')
存儲過程中可以這樣用:
create or replace procere getNameByFincode(inputStr in varchar2,
resultStr out varchar2) is

begin
resultStr := TestFunOne(inputStr);
end getNameByFincode;

(2)java程序中一般是直接執行sql語句或者調用存儲過程
java執行sql語句可以這樣:
String sql="update tableName t set t.columnName = TestFunOne('1')";
stmt.executeUpdate(sql);

java中調用存儲過程可以這樣:
CallableStatement callStmt = connection.prepareCall("call getNameByFincode(?,?)");

以上都是最簡單的例子,具體展開網上也都可以查閱,希望能解決你的問題O(∩_∩)O~

Ⅳ oracle存儲過程如何返回記錄集

返回一個游標社!
有倆種方法:
一種是聲明系統游標,一種是聲明自定義游標,然後後面操作一樣,參數類型為
in out 或out
(1)聲明個人系統游標.(推薦)
create or replace p_temp_procere
(
cur_arg out sys_refcursor; --方法1
)
begin
open cur_arg for select * from tablename;
end
調用
declare
cur_calling sys_refcursor;
begin
p_temp_procere(cur_calling); --這樣這個游標就有值了
for rec_next in cur_calling loop
....
end loop;
end;

(2)在包頭中申明一個游表類型,然後調用者申明一個這個類型的游標變數,傳給返回遊標的存儲過程 ,存儲過程out這個結果集,這種方法很麻煩.游標類型不能像索引表一樣使用create or replace type方法來創建,所以只能在包中申明,並且需要使用/來執行,後面的存儲過程才認這個游標類型.(不推薦,但是建議要知道並且要會這種方式,畢竟它有它存在的道理)
--定義全局變數
create or replace package pkg_package
as
type type_cursor is ref cursor;
type type_record is record
(
test01 varchar2(32),
test02 varchar2(32),
test03 varchar2(32)
);
end;
/
--創建返回遊標的存儲過程
create or replace procere p_temp_procere
(
cur_out_arg out pkg_package.type_cursor
)
is
begin
open cur_out_arg for select * from test;
end;
/
--調用
declare
cur_out_arg pkg_package.type_cursor;
rec_arg pkg_package.type_record;
begin
p_temp_procere(cur_out_arg);
fetch cur_out_arg into rec_arg;
dbms_output.put_line(rec_arg.test01);
dbms_output.put_line(rec_arg.test02);
dbms_output.put_line(rec_arg.test03);
end;

Ⅳ Oracle存儲過程怎麼返回結果

這個存儲過程你可以在TEST的環境下查看結果,不過你需要隱式游標來進行操作,那樣才能看到,具體步驟如下:
1、首先我們要藉助游標,因此需要先定義一個返回類型的游標
create or replace package type_difinition
as
type mycursor is ref cursor;
end type_difinition;
2、改寫你的存儲過程,要想查看執行SQL後結果需要一個返回參數,這個參數即上面定義的游標
類型
create or replace procere select_pro(
p_result out type_difinition.mycursor -- 返回結果
)
is
syn_sql varchar2(200) default '';
begin
syn_sql := 'select * from emp';
-- 此處打開游標,並把需執行的SQL賦值給游標
open p_result for syn_sql;
end select_pro;
3、執行編譯通過後,右鍵點擊存儲過程的名字,跳出框,選擇Test一項,進入Test界面
4、點擊編譯、再點擊執行
5、Test界面的底部界面,有個Variable Type value的列表,此時你可以點擊Value值裡面的
... 按鈕,即可查看結果,由於不怎麼會應用這個編輯器,本想把圖片上傳給你,如有不解,再詳問,希望回答對樓主有幫助

Ⅵ 如何在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;
/

Ⅶ oracle 存儲過程返回結果集怎麼實現用java如何調用這個存儲過程比如表scott下的emp表

1:首先你需要創建一個包,並定義你返回的游標的類型、存儲過程

create or replace package TEST_PKG is

type cur_emp is REF CURSOR;

procere test_proc (emps out cur_emp);

end TEST_PKG;

2:然後你再創建包體

create or replace package body TEST_PKG is

procere test_proc (emps out cur_emp)
as
begin
open emps for select * from emp;
end test_proc;
end TEST_PKG ;

3,通過JAVA調用

cstmt = conn.prepareCall("{call TEST_PKG .test_proc (?)}");
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.execute();

//獲得結果集
rs = (ResultSet)cstmt.getObject(4);
while(rs.next()){......}

注意:游標類型需要你在連接未關閉之前進行本地持久化,不然連接關閉了就無法解析了哦^-^,如果還不懂可以聯系我!

Ⅷ C#調用oracle存儲過程返回數據集

///<summary>
///執行存儲過程
///</summary>
///<paramname="storedProcName">存儲過程名</param>
///<paramname="parameters">存儲過程參數</param>
///<paramname="tableName">DataSet結果中的表名</param>
///<returns>DataSet</returns>
publicstaticDataSetRunProcere(stringstoredProcName,IDataParameter[]parameters,stringtableName)
{
using(OracleConnectionconnection=newOracleConnection(connectionString))
{
DataSetdataSet=newDataSet();
connection.Open();
OracleDataAdaptersqlDA=newOracleDataAdapter();
sqlDA.SelectCommand=BuildQueryCommand(connection,storedProcName,parameters);
sqlDA.Fill(dataSet,tableName);
connection.Close();
returndataSet;
}
}
///<summary>
///構建OracleCommand對象(用來返回一個結果集,而不是一個整數值)
///</summary>
///<paramname="connection">資料庫連接</param>
///<paramname="storedProcName">存儲過程名</param>
///<paramname="parameters">存儲過程參數</param>
///<returns>OracleCommand</returns>
(OracleConnectionconnection,stringstoredProcName,IDataParameter[]parameters)
{
OracleCommandcommand=newOracleCommand(storedProcName,connection);
command.CommandType=CommandType.StoredProcere;
foreach()
{
command.Parameters.Add(parameter);
}
returncommand;
}

Ⅸ oracle存儲過程帶參返回結果集

create or replace procere p_cnt(
p_time in varchar2,---查詢的條件
p_cur out SYS_REFCURSOR)---游標返回

IS
v_sql varchar2(1000) :='';
v_date varchar2(20);

BEGIN
v_date := replace(p_time, '-', '');---時間的格式轉換
v_sql := 'select * from dapartment d where d.d_time ='''|| v_date||'''';
END;
OPEN p_cur FOR v_sql;

END p_cnt;

Ⅹ oracle存儲過程怎麼返回結果集

你這不是已經寫好了嘛。
外層調用程序只要聲明變數mycursor並且作為參數傳到emp_pro存儲過程中,執行結束後就可以使用了。

熱點內容
php判斷ip 發布:2024-11-16 21:07:03 瀏覽:738
有看頭密碼怎麼改 發布:2024-11-16 20:57:39 瀏覽:326
A有語法錯誤不能編譯 發布:2024-11-16 20:49:17 瀏覽:946
廚房需要配置什麼噴淋頭 發布:2024-11-16 20:39:02 瀏覽:298
酒瓶解壓 發布:2024-11-16 20:29:20 瀏覽:730
視頻怎樣上傳到手機 發布:2024-11-16 20:26:30 瀏覽:259
怎麼把ppt文件壓縮 發布:2024-11-16 20:22:30 瀏覽:686
linux大內存 發布:2024-11-16 20:22:28 瀏覽:951
屏蔽迅雷上傳 發布:2024-11-16 19:49:17 瀏覽:600
java怎麼定義方法 發布:2024-11-16 19:48:15 瀏覽:144