X
xao_hx
Unregistered / Unconfirmed
GUEST, unregistred user!
delphi中用ODAC5.10控件调用Oracle存储过程参数的问题(一个分页的包)
先看我在orace9.2中定义的过程:
---**********oracle中实现的分页存储过程_包头(这里我省略包体不影响问题的说明)
create or replace Package Div_Page is
TYPE type_cur IS REF CURSOR; --定义游标变量用于返回记录集
procedure implement(
Page_Index in number, --分页索引
Page_Size in number, --页面大小
Page_Count out number, --返回分页总数
Records_Count out number, --返回记录总数
Str_Sql in varchar2, --产生dataset的sql语句
v_cur out type_cur --返回当前页数据记录,v_cur是游标变量
);
end Div_Page;
如果是静态调用的话可以成功返回数据,但是要是动态调用就出现问题!看看我的调用:
procedure TForm1.Button1Click(Sender: TObject);
var
Page_Count,Records_Count:integer;//1.这里到底该用什么类型呢,delphi用什么类型来对应oracle中的number类型呢?
Str_Sql:string;
begin
Str_Sql:='select * from dc_qzcsb t';
OraStoredProc1.Close;
OraStoredProc1.Params.Clear;
//给过程名赋值并调用
OraStoredProc1.StoredProcName:='jczhxxgl.DIV_PAGE.IMPLEMENT';
OraStoredProc1.SQL.Add('begin jczhxxgl.DIV_PAGE.IMPLEMENTPAGE_INDEX, AGE_SIZE, AGE_COUNT, :RECORDS_COUNT, :STR_SQL, :V_CUR);end;');
//创建过程的参数-2.我想问这部分到底怎么写阿?
OraStoredProc1.Params.CreateParam(ftFloat;'PAGE_INDEX';ptInput);/*此处编译时报错:'(' expected [ but ';' found. Statement expected but 'IN' found,简直与写这个方法时系统的提示的格式自相矛盾阿!以下错误一样!*/
OraStoredProc1.Params.CreateParam(ftFloat;'PAGE_INDEX';ptInput);
OraStoredProc1.Params.CreateParam(ftFloat;'Page_Size';ptInput);
OraStoredProc1.Params.CreateParam(ftFloat;'Page_Count';ptOutput);
OraStoredProc1.Params.CreateParam(ftFloat;'Records_Count';ptOutput);
OraStoredProc1.Params.CreateParam(ftString;Str_Sql;ptInput);
OraStoredProc1.Params.CreateParam(ftCursor;'v_cur';ptOutput);
//给过程的参数赋值-A方法——3.两种赋值方法到底那种对呢?格式是按照系统提示作的,没问题
OraStoredProc1.Params.ParamValues['Page_Index']:='0';
OraStoredProc1.Params.ParamValues['Page_Size']:='100';
OraStoredProc1.Params.ParamValues['Str_Sql']:=Str_Sql;
OraStoredProc1.Prepare;
//给过程的参数赋值-B方法
OraStoredProc1.Params.ParamByName('Page_Index').Value:='0';
OraStoredProc1.Params.ParamByName('Page_Size').Value:='100';
OraStoredProc1.Params.ParamByName('Str_Sql').Value:=Str_Sql;
OraStoredProc1.Prepare;
OraStoredProc1.ExecProc; //执行过程
OraStoredProc1.Open;
OraDataSource1.DataSet:=OraStoredProc1; //返回数据集
Page_Count:=OraStoredProc1.Params.ParamValues['Page_Coun'];//返回分页数
Records_Count:=OraStoredProc1.Params.ParamValues['Records_Count'];//返回记录数
showmessage('页码总数:'+inttostr(Page_Count)+'and'+'记录总数:'+inttostr(Records_Count));
end;
4.如果不要创建过程的参数那部分,同时把OraStoredProc1.Params.Clear;去掉而把过程名赋值那部分加上,而无论用参数赋值的A和B方法都说找不到page_index参数,我在大富翁查了看看的,很多人发现这种问题,我按照他们方法试了一些,但是无济于事啊!我用的是delphi6&oracle9.2&odac5.10控件。
请高手赐教啊!只知道一部分也可以回答呀?
先看我在orace9.2中定义的过程:
---**********oracle中实现的分页存储过程_包头(这里我省略包体不影响问题的说明)
create or replace Package Div_Page is
TYPE type_cur IS REF CURSOR; --定义游标变量用于返回记录集
procedure implement(
Page_Index in number, --分页索引
Page_Size in number, --页面大小
Page_Count out number, --返回分页总数
Records_Count out number, --返回记录总数
Str_Sql in varchar2, --产生dataset的sql语句
v_cur out type_cur --返回当前页数据记录,v_cur是游标变量
);
end Div_Page;
如果是静态调用的话可以成功返回数据,但是要是动态调用就出现问题!看看我的调用:
procedure TForm1.Button1Click(Sender: TObject);
var
Page_Count,Records_Count:integer;//1.这里到底该用什么类型呢,delphi用什么类型来对应oracle中的number类型呢?
Str_Sql:string;
begin
Str_Sql:='select * from dc_qzcsb t';
OraStoredProc1.Close;
OraStoredProc1.Params.Clear;
//给过程名赋值并调用
OraStoredProc1.StoredProcName:='jczhxxgl.DIV_PAGE.IMPLEMENT';
OraStoredProc1.SQL.Add('begin jczhxxgl.DIV_PAGE.IMPLEMENTPAGE_INDEX, AGE_SIZE, AGE_COUNT, :RECORDS_COUNT, :STR_SQL, :V_CUR);end;');
//创建过程的参数-2.我想问这部分到底怎么写阿?
OraStoredProc1.Params.CreateParam(ftFloat;'PAGE_INDEX';ptInput);/*此处编译时报错:'(' expected [ but ';' found. Statement expected but 'IN' found,简直与写这个方法时系统的提示的格式自相矛盾阿!以下错误一样!*/
OraStoredProc1.Params.CreateParam(ftFloat;'PAGE_INDEX';ptInput);
OraStoredProc1.Params.CreateParam(ftFloat;'Page_Size';ptInput);
OraStoredProc1.Params.CreateParam(ftFloat;'Page_Count';ptOutput);
OraStoredProc1.Params.CreateParam(ftFloat;'Records_Count';ptOutput);
OraStoredProc1.Params.CreateParam(ftString;Str_Sql;ptInput);
OraStoredProc1.Params.CreateParam(ftCursor;'v_cur';ptOutput);
//给过程的参数赋值-A方法——3.两种赋值方法到底那种对呢?格式是按照系统提示作的,没问题
OraStoredProc1.Params.ParamValues['Page_Index']:='0';
OraStoredProc1.Params.ParamValues['Page_Size']:='100';
OraStoredProc1.Params.ParamValues['Str_Sql']:=Str_Sql;
OraStoredProc1.Prepare;
//给过程的参数赋值-B方法
OraStoredProc1.Params.ParamByName('Page_Index').Value:='0';
OraStoredProc1.Params.ParamByName('Page_Size').Value:='100';
OraStoredProc1.Params.ParamByName('Str_Sql').Value:=Str_Sql;
OraStoredProc1.Prepare;
OraStoredProc1.ExecProc; //执行过程
OraStoredProc1.Open;
OraDataSource1.DataSet:=OraStoredProc1; //返回数据集
Page_Count:=OraStoredProc1.Params.ParamValues['Page_Coun'];//返回分页数
Records_Count:=OraStoredProc1.Params.ParamValues['Records_Count'];//返回记录数
showmessage('页码总数:'+inttostr(Page_Count)+'and'+'记录总数:'+inttostr(Records_Count));
end;
4.如果不要创建过程的参数那部分,同时把OraStoredProc1.Params.Clear;去掉而把过程名赋值那部分加上,而无论用参数赋值的A和B方法都说找不到page_index参数,我在大富翁查了看看的,很多人发现这种问题,我按照他们方法试了一些,但是无济于事啊!我用的是delphi6&oracle9.2&odac5.10控件。
请高手赐教啊!只知道一部分也可以回答呀?