我想用ADODataSet调用返回数据集的存储过程
存储过程
create or replace package pak_pantest
as
type pan_cursor is ref cursor;
procedure getpan(p_id in number,resustcor out pan_cursor);
end pak_pantest;create or replace package body pak_pantest
is
procedure getpan(p_id in number,resustcor out pan_cursor)
is
begin
open resustcor for
select t.* from bcsent t where p_id > t.crment_id;
end;
end pak_pantest;delphi代码type
  TForm1 = class(TForm)
    con1: TADOConnection;
    ds1: TADODataSet;
    btn1: TButton;
    mm1: TMemo;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
var
  s:string;
begin
 ds1.Close;
 ds1.CommandType := cmdText;
 ds1.Parameters.Clear;
 ds1.CommandText := '{call pak_pantest.getpan(?)}';
 ds1.Parameters.CreateParameter('p1',ftInteger,pdInput,10,4);
 ds1.Open;
 while not ds1.Eof do
 begin
   s :='';
   s := s + '名字:' + string(ds1.FieldByName('CRMENT_NAME').Value);
   mm1.Lines.Add(s);
   s :='';
   s := s + 'ID:' + string(ds1.FieldByName('crment_id').Value);
   mm1.Lines.Add(s);
   ds1.Next;
 end
end;
当我点击btn1按钮时,弹出“列不存在”的错误,并且我调试发现 程序走到while not ds1.Eof do,弹出“列不存在”的错误,求教是什么原因?

解决方案 »

  1.   

    with self.ADOStoredProc1 do  
    begin  //Provider=MSDAORA.1;Password=manager;User ID=system;Data Source=orcl;Persist Security Info=True 
    Connection:= self.ADOConnection1; 
    ProcedureName:='pak_pantest.getpan'; 
    Parameters.Clear; 
    Parameters.CreateParameter('p1',ftInteger,pdInput,10,4);
    Open; ......
    end;
      

  2.   

    ADO的东西貌似不能对应ORACLE的游标的吧?
      

  3.   

    还有就是这种返回游标的形式,在存储过程中不能在返回语句select t.* from bcsent t where p_id > t.crment_id;后面用close cursor关闭游标,如果关闭了,delphi端会报错
    这种情况下怎么关闭游标?
    还是说在delphi端ADOStoredProc1.close之后就会自动关闭游标?
      

  4.   

    oracle会自动销毁你创建的动态游标