delphioracle存儲過程
㈠ 如何在Delphi中調用oracle的存儲過程返回數據集的相關推薦
一.創建包與包體
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中調用SQL(oracle)存儲過程最好能給個簡單的例子!
存儲過程如下
Sql 2000中寫法
CREATE PROCEDURE opLogin
@op_code int , --操作員工號
@password varchar(10)
as
begin
if (@op_code = 100 )
return 100
end
//oracle 中寫法
CREATE OR REPLACE PROCEDURE opLogin(
op_code int , --操作員工號
password varchar)
is
begin
if ( op_code = 100 ) then
return ;
end if;
end opLogin;
存儲過程如下
Sql 2000中寫法
CREATE PROCEDURE opLogin
@op_code int , --操作員工號
@password varchar(10)
as
begin
if (@op_code = 100 )
return 100
end
//oracle 中寫法
CREATE OR REPLACE PROCEDURE opLogin(
op_code int , --操作員工號
password varchar)
is
begin
if ( op_code = 100 ) then
return ;
end if;
end opLogin;
存儲過程如下
Sql 2000中寫法
CREATE PROCEDURE opLogin
@op_code int , --操作員工號
@password varchar(10)
as
begin
if (@op_code = 100 )
return 100
end
//oracle 中寫法
CREATE OR REPLACE PROCEDURE opLogin(
op_code int , --操作員工號
password varchar)
is
begin
if ( op_code = 100 ) then
return ;
end if;
end opLogin;
Delphi Ado中用 TADOCommand 調用sql2000中的存儲過程可以如下
ADOConnection1.Connected:=true;
ADOCommand1.CommandType:=cmdText;
ADOCommand1.CommandText:='exec pubs..opLogin @password=''123456'',@op_code=999';
ADOCommand1.Execute;
樓主看看把
㈢ 如何在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博客
㈣ delphi 三層架構如何調用oracle 存儲過程,應該使用哪個部件,最好有實例
存儲過程:
create
or
replace
procere
P_MyTest
(
m_strin
in
varchar2,
m_stradd
in
varchar2,
m_errorcode
out
varchar2
)
as
i
number;
begin
m_errorcode
:=
'1111';
select
count(*)
into
i
from
MyProcTest
where
vc_teststr
=
m_strin;
if
i
>0
then
begin
update
MyProcTest
set
vc_teststr
=
substr(m_strin||m_stradd,1,10);
m_errorcode
:=
'0000';
commit;
end;
end
if;
end;
delphi:
procere
TForm1.btn1Click(Sender:
TObject);
begin
with
TADOStoredProc.Create(Application)
do
begin
try
Connection
:=
con1;
if
Active
then
Close;
ProcereName
:=
'P_MyTest';
Parameters.Clear;
Parameters.CreateParameter('m_strin',ftstring,pdInput,10,null);
Parameters.CreateParameter('m_stradd',ftstring,pdInput,10,null);
Parameters.CreateParameter('m_errorcode',ftstring,pdOutput,4,null);
Parameters.ParamByName('m_strin').Value
:=
'wang';
Parameters.ParamByName('m_stradd').Value
:=
'jm';
Prepared:=true;
ExecProc;
mstr
:=
Parameters.ParamByName('m_errorcode').Value;
finally
close;
free;
end;
end;
edt1.text
:=
mstr;
end;
㈤ 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
ASprocere 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=12.在窗體上加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 ;
本文來自CSDN博客,轉載請標明出處: http://blog.csdn.net/yzsind/archive/2005/01/20/261176.aspx
㈥ 高分,高人來得,請問delphi如何調用oracle的存儲過程,並返回視圖。拜託了各位 謝謝
p_id in number,p_name in varchar2,p_addr in varchar2)isinsert into liudzh.liu_table values(p_id,p_name,p_addr);commit;end;begin with StoredProc1 do for i := StrToInt(Edit1.text) to StrToInt(Edit4.Text) do StoredProc1.Params[0].AsInteger := i; try StoredProc1.Params[1].AsString := Edit2.Text+IntToStr(i); StoredProc1.Params[2].AsString := Edit3.Text+IntToStr(i); StoredProc1.Prepare; StoredProc1.ExecProc; except ShowMessage('error'); end; CREATE procere add_new(如何,該給分了吧! 查看更多答案>>
㈦ 如何用Delphi4的TDbGrid 顯示ORACLE存儲過程返回的記錄集
我們有來由信賴oracle。如斯定義一個類型(RETURN
return_type鄙人面的例子中應當省略)--
TYPE
GenericCurTyp
is
REF
CURSOR
RETURN
return_type;
TYPE
GenericCurTyp
is
REF
CURSOR;END
cv_types;過程如斯建立。PROCEDURE
open_cv
(generic_cv
IN
OUT
cv_types.GenericCurTyp,
choice
NUMBER)
ISBEGIN
OPEN
generic_cv
FOR
SELECT
*
FROM
emp;
ELSIF
choice
=
2
THENCREATE
OR
WordStr
PACKAGE
cv_types
AS
OPEN
generic_cv
FOR
SELECT
*
FROM
dept;
ELSIF
choice
=
3
THEN
OPEN
generic_cv
FOR
SELECT
*
FROM
salgrade;
END
IF;END;留意:返回的游標必須是第一個參數,且要指明參數類型為ftCursor信賴對你會很有贊助。OPEN
generic_cv
FOR
'SELECT
*
FROM
emp
WHERE
empid
>
'||
Parameter
;不足:oracle如今不克不及返回動態SQL的萌芽結不雅。但可以應用以下辦法達到同樣的效不雅
IF
choice
=
1
THEN前台應用TStoredProc
㈧ 請問高手:在Delphi中怎樣調用Oracle中返回結果集的存儲過程
用Delphi的TADOStoreProcere連接Oracle的存儲過程可以執行,我已經用了幾次了,只是我的存儲過程是在三層中的中間層寫的,而且我並沒有返回一個數據集 ,你可以將放回的數據定義稱多維數組,返回調用如下:adspRunYtj.Parameters.ParamByName('ny').Value:=NY;
㈨ delphi中用doa運行oracle存儲過程的例子
ADOStoredProc1.Parameters.ParamByName('參數名1').Value:=和參數類型匹配的值;
ADOStoredProc1.Parameters.ParamByName('參數名2').Value:=和參數類型匹配的值;
.....
ADOStoredProc1.open;
存儲過程名字不動態指定,設計時指定好,不需要@return_value參數,在設計時Parameters里刪除掉,直接將ADOStoredProc1作為數據集控制項,參數賦值的時候要注意和你存儲過程的參數一致,順序也要一致,要保證存儲過程最後執行的是SELECT 語句,ADOStoredProc1.open就可以了
不好意思啊。沒看清楚題目,你這個確實沒用過,看看下面給你的網址,說得非常的詳細,看了才知道DOA是Direct Oracle Access,先汗一下
http://tech.sina.com.cn/c/2001-08-29/5473.html
㈩ delphi如何調用帶out參數的oracle存儲過程期待高手....
p1:string;
p2:number;
with ADOQuery2 do
begin
close;
SQL.Clear;
parameters.Clear;
SQL.Add('select get_mul(:enter_name,:psw,:lim) from lzj.n82_user');
Parameters.ParamByName('enter_name').Value:=username.Text;
Parameters.ParamByName('psw').Value:=P1;
Parameters.ParamByName('lim').Value:=P2;
open;
p1:=Parameters.ParamByName('psw').Value;
p2:=Parameters.ParamByName('lim').Value;
end;
end;
按照以上代碼試一試吧,現在沒有環境試不了。
如果還不行就換控制項吧,用ADOProcere