急急急急急急急急急急急急急急急急!!!!!!!
本人包中的两个存储过程声明如下,想每个过程都用***ClientDataSet**和**ADOQuery***来调用,也就是说需要四个调用!!!如何实现!!!第一个过程的功能:传入一个或多个一般类型的参数,**返回多个**一般类型的值
第二个过程的功能:传入一个或多个一般类型的参数,**返回所得的查询数据集**,也就是游标sql server 中利用存储过程的一个特性,即存储过程中的最后一条select 作为返回集,轻松实现上述两个过程。想问oracle中大家如何实现上述两个功能。
如果用别的方法不用下面这样的函数请指点!!!!!!create or replace package PKG_JCCTEST1
AS
TYPE RCTYPE1 IS REF CURSOR;
PROCEDURE GetSumAndSub(p number ,p2 number , result1 out number ,result2 out number);procedure GetDataSetById(p_id varchar2 , rc1 rctype1);end ;
我已经搜索相关版关以前的贴子,不能解决本人问题,谢绝copy网上以前的代码作为回复!!!!
本人包中的两个存储过程声明如下,想每个过程都用***ClientDataSet**和**ADOQuery***来调用,也就是说需要四个调用!!!如何实现!!!第一个过程的功能:传入一个或多个一般类型的参数,**返回多个**一般类型的值
第二个过程的功能:传入一个或多个一般类型的参数,**返回所得的查询数据集**,也就是游标sql server 中利用存储过程的一个特性,即存储过程中的最后一条select 作为返回集,轻松实现上述两个过程。想问oracle中大家如何实现上述两个功能。
如果用别的方法不用下面这样的函数请指点!!!!!!create or replace package PKG_JCCTEST1
AS
TYPE RCTYPE1 IS REF CURSOR;
PROCEDURE GetSumAndSub(p number ,p2 number , result1 out number ,result2 out number);procedure GetDataSetById(p_id varchar2 , rc1 rctype1);end ;
我已经搜索相关版关以前的贴子,不能解决本人问题,谢绝copy网上以前的代码作为回复!!!!
参数通过parms传递
//in sqlplus
create or replace procedure test(a1 in varchar,a2 in integer,b1 out varchar,b2 out integer)
as
begin
b1:=a1;
b2:=a2;
end;
/
object Form1: TForm1
Left = 192
Top = 107
Width = 544
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object BitBtn1: TBitBtn
Left = 120
Top = 144
Width = 75
Height = 25
Caption = 'BitBtn1'
TabOrder = 0
OnClick = BitBtn1Click
end
object Edit1: TEdit
Left = 192
Top = 48
Width = 121
Height = 21
TabOrder = 1
Text = 'Edit1'
end
object Edit2: TEdit
Left = 360
Top = 48
Width = 121
Height = 21
TabOrder = 2
Text = 'Edit2'
end
object ddd: TADOStoredProc
ConnectionString =
'Provider=MSDAORA.1;Password=smims2000;User ID=smims2000;Data Sou' +
'rce=ora9;Persist Security Info=True'
ProcedureName = 'TEST'
Parameters = <
item
Name = 'A1'
DataType = ftString
Size = 2000
end
item
Name = 'A2'
DataType = ftBCD
Precision = 15
end
item
Name = 'B1'
DataType = ftString
Direction = pdOutput
Size = 2000
end
item
Name = 'B2'
DataType = ftBCD
Direction = pdOutput
Precision = 15
end>
Left = 120
Top = 48
end
end
//
with ddd do
begin
Parameters.ParamValues['a1']:='12345678';
Parameters.ParamValues['a2']:=200;
execproc;
edit1.text:=Parameters.ParamValues['b1']; edit2.text:=Parameters.ParamValues['b2'];
end;
注释里的是oracle里的调用
非注释里的是sql server里的调用
// 调用存储过程
// procEmployeeNo.StoredProcName := 'PROEMPLOYEENO';
// procEmployeeNo.Params.Clear ;
// procEmployeeNo.Params.CreateParam(ftString, 'SYEAR', ptInput) ;
// procEmployeeNo.Params.CreateParam(ftString, 'RETURNEMPLOYEENO', ptOutput) ; // 创建并调用函数
adofunDispatchId:= TADOStoredProc.Create(nil);
adofunDispatchId.ProcedureName :='funGetSendDocId';
adofunDispatchId.ConnectionString:='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=PubDoc;Data Source=localhost'; adofunDispatchId.Parameters.CreateParameter('@RETURN_VALUE',ftString,pdReturnValue,50,0);
adofunDispatchId.Parameters.CreateParameter('@ParaId',ftString,pdInput,50,0);
adofunDispatchId.Parameters.CreateParameter('@ParaDate',ftString,pdInput,10,0); if adofunDispatchId.Active then adofunDispatchId.Close;
adofunDispatchId.Parameters[1].Value:=sPlace;
adofunDispatchId.Parameters[2].Value:=sYear;
try
adofunDispatchId.ExecProc;
edtDispatchId.Text:= adofunDispatchId.Parameters.ParamByName('@RETURN_VALUE').Value;
//edtDispatchId.Text:=adofundispatchId.Parameters[0].Value;
//showmessage(adofundispatchId.Parameters[0].Value);
edtNum.Text:=copy(edtDispatchId.Text,(length(sPlace)+length(sYear)+2+1),(length(edtDispatchId.Text)-length('号')));
edtNum.Text:=copy(edtNum.Text,1,length(edtNum.text)-2);
except
Application.MessageBox(pchar('产生函数有错,请重试'), '提示', MB_OK);
exit;
end;试试吧
还请问有没有clientdataset 和adoquery的完整例子?!!!!!
把原来adodataset的代码放到clientdataset中即可。
爽呀,过两天整理出来大家看看,唉,搞完之后觉得太小儿科了:)花了我三天时间,在csdn上苦苦等待三天,还是大富翁上找到答案,感谢沉香屑!!!!!好久没有这种感觉了,一个字,爽!!!!!
例如查询scott下面的emp
1.建包,定义游标类型和过程
create or replace Package pkg_demo
AS
TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
procedure open_emp_cv(emp_cv OUT EmpCurTyp);
END pkg_demo;
2。定义包体
create or replace package body pkg_demo
AS
procedure open_emp_cv (emp_cv OUT EmpCurTyp)
IS
BEGIN
OPEN emp_cv FOR SELECT * FROM emp;
END open_emp_cv;
end pkg_demo;
3。建立ado连接,注意用oracle的provider,连接字符串里包含“PLSQLRSet=1”
ADOConnection1.ConnectionString:='PLSQLRSet=1;Provider=OraOLEDB.Oracle;Password=tiger;Persist Security Info=True;User ID=scott;Data Source=fjddmis;Extended Properties=""';
ADOConnection1.Open;
4。用TADODataset调用存储过程,注意调用格式
ADODataSet1.Connection:=ADOConnection1;
ADODataSet1.CommandText:='{call pkg_demo.open_emp_cv}';
ADODataSet1.CommandType:=cmdText;
ADODataSet1.Open;
------------------------ 这是 沉香屑 大侠在lid=1107306中的回答。很经典。
来自:jrq, 时间:2002-9-13 11:33:00, ID:1322683
http://otn.oracle.com/docs/tech/windows/ole_db/doc/html/using.htm#1000470 如是说: