我在Oracle里写了一个存储过程,如下
create or replace procedure dbusrvip.sp_park_up(p_cardno   in varchar2, --卡号
                                       p_mktcode  in varchar2, --门店
                                       p_terminal in varchar2, --终端 可以不传
                                       p_Jf       in number, -- 积分
                                       ret        out varchar2) is
  --1 成功 0 失败
  l_cid varchar2(40);
  lye   number;我在PLSQL里运行时正常的,但我在delphi 里调用却提示"不正常地定义参数对象。提供了不一致或不完整的信息"这是为何?ADOStoredProc1.Close;
ADOStoredProc1.ProcedureName:='sp_park_up';
ADOStoredProc1.Parameters[0].Value:=trim(Edit1.Text);
ADOStoredProc1.ExecProc;忘高手指点,在线等待..

解决方案 »

  1.   

    不好意思写错了应该是
    create or replace procedure dbusrvip.sp_park_select(p_cardno in varchar2,
                                               ret  out varchar2,--0 失败 1 成功
                                               rcardno out varchar2,--卡号
                                               rtype  out varchar2,--类别
                                               rtypename out varchar2,--类别名称
                                               rjf  out number,--积分
                                               rstatus out varchar2) is--状态 Y 正常 N 不正常
      lcid varchar2(20);
      lcardno varchar2(40);我在PLSQL里运行时正常的,但我在delphi 里调用却提示"不正常地定义参数对象。提供了不一致或不完整的信息"这是为何?ADOStoredProc1.Close;
    ADOStoredProc1.ProcedureName:='sp_park_select';
    ADOStoredProc1.Parameters[0].Value:=trim(Edit1.Text);
    ADOStoredProc1.ExecProc
      

  2.   

    create or replace procedure dbusrvip.sp_park_select(p_cardno in varchar2,
                                               ret  out varchar2,--0 失败 1 成功
                                               rcardno out varchar2,--卡号
                                               rtype  out varchar2,--类别
                                               rtypename out varchar2,--类别名称
                                               rjf  out number,--积分
                                               rstatus out varchar2) is--状态 Y 正常 N 不正常
      lcid varchar2(20);
      lcardno varchar2(40);
    begin
      lcardno := replace(p_cardno,';','');
      lcardno := replace(lcardno,'?','');
      lcardno := replace(lcardno,';','');
      lcardno := replace(lcardno,'?','');
      rcardno := fcardtracktono(lcardno);
      if rcardno is null then
         ret :='0';
         return;
       end if;
      begin
           select cdmtype,cdmcid,cdmstatus
           into rtype ,lcid,rstatus
           from cardmain
           where cdmno = rcardno ;
           select ctname into rtypename from custtype where ctcode = rtype; 
      exception when others then
                ret :='0';
                return;
      end ;
      
      begin
          select ccurjfye 
          into rjf
          from customer
          where cid = lcid;
      exception when others then
                rjf :=0;
      end ;
      ret :='1';
    end sp_park_select;这是完整的存储过程麻烦给位大哥帮看看,小弟在线等待急...
    我在PLSQL里面测试时正常的,但在delphi里测试就出错,这是为何
      

  3.   

    直接用ADOQUERY也行的啊ADOQUERY.SQL.ADD('EXEC sp_park_select(参数)')试试
      

  4.   

    to duck04551
    我的数据库是Oracle呀,你那个调用是sql server的调用方法,Oracle这样是调用不了的
      

  5.   

    方式刚才那样,用参数化试试罗,我调用过ORACle包的过程
      

  6.   

    to hongqi162
    我直接在delphi里调试他就直接报这个错呀,ADOStoredProc1里面的参数都是他自动搜索出来的,应该没问题吧,能不能给个具体方案呢?万分感谢
      

  7.   

    没设置输出参数吧,ProcedureName:='sp_park_up';这句不用,过程名在设计状态时就赋好var
     s1,s1,s3,s4 ...:String;
    .....with   ADOStoredProc1   do 
    begin 
        close; 
        parameters[0].value:=trim(Edit1.Text);
        parameters[1].values:=s1;     // 
        parameters[2].values:=s2;  
        parameters[3].values:=s3;  
        .. 
        ExecProc; 
      

  8.   

    to goodhj输出参数已经在 ADOStoredProc1里设置好了,是它自动搜索的