用ODAC5.10控件调用Oracle存储过程参数时的问题(一个分页的包) ( 积分: 100 )

  • 主题发起人 主题发起人 xao_hx
  • 开始时间 开始时间
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.IMPLEMENT(:PAGE_INDEX, :PAGE_SIZE, :PAGE_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控件。

请高手赐教啊!只知道一部分也可以回答呀?
 
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.IMPLEMENT(:PAGE_INDEX, :PAGE_SIZE, :PAGE_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控件。

请高手赐教啊!只知道一部分也可以回答呀?
 
没有人知道吗
 
明天在来看开
 
怎么没有人知道
 
问题已经解决了,合乎和
 
我的建议不错把,给分我啊
 
接受答案了.
 

Similar threads

后退
顶部