使用TSqlQuery调用存储过程返回一个游标时听别人说游标输出参数不需要定义但是我的提示缺少一个参数请提示
存储过程
PROCEDURE getrule (jsname IN VARCHAR, qxjs OUT tmh.cvsx)
   IS
      qxname   VARCHAR2 (60);
      gname    VARCHAR2 (60);
   BEGIN
      OPEN qxjs FOR
         SELECT tmh.qx.NAME qxname, tmh.gnmk.NAME gnname
           FROM tmh.qx, tmh.gnmk
          WHERE tmh.qx.ID IN (
                       SELECT ID
                         FROM tmh.rule
                        WHERE tmh.rule.gnid =
                                            (SELECT ID
                                               FROM tmh.zhrule
                                              WHERE tmh.zhrule.NAME = jsname))
            AND tmh.gnmk.ID IN (
                        SELECT gnid
                          FROM tmh.rule
                         WHERE tmh.rule.gnid =
                                             (SELECT ID
                                                FROM tmh.zhrule
                                               WHERE tmh.zhrule.NAME = jsname));
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         NULL;
      WHEN OTHERS
      THEN
         -- Consider logging the error and then re-raise
         RAISE;
   END getrule;
调用存储过程
with GETRUL do
      begin
        GETRUL.Close;
        with sql do
          begin
            sql.Clear;
            sql.Add('{call tmh.getrule(?)} ');
          end;
          GETRUL.Parameters.CreateParameter('jsname',ftString,pdinput,60,trim(jsid.Text));
          GETRUL.Open;
        end;
错误提示
参数个数或类型错误。

解决方案 »

  1.   

    路过,ORACLE还没用过..DELPHI里肯定有个参数回传给ORACLE的存储过程的..
    @xxx varchar(1000)
     ORACLE里好像没看见你定义参数
      

  2.   

    在包体中定义了ref游标CREATE PACKAGE TMH.tmh
    AS
    /******************************************************************************
       NAME:       tmh
       PURPOSE:   REVISIONS:
       Ver        Date        Author           Description
       ---------  ----------  ---------------  ------------------------------------
       1.0        2006-01-03             1. Created this package.
    ******************************************************************************/
       TYPE cvsx IS REF CURSOR;   PROCEDURE addrul (
          gnname   IN   VARCHAR2,
          jsname   IN   VARCHAR2,
          qxname   IN   VARCHAR2
       );   PROCEDURE getrule (jsname IN VARCHAR, qxjs OUT tmh.cvsx);
    END tmh;
    /
      

  3.   

    记得有人提过类似问题,我的回答找不到了,我以前用过.不过好像BDE或ado都有问题,用odac肯定是可以的,所以建议你装个odac试试
    按我们的使用经验odac在各方面都强与bde/ado,至少它的程序发布时不用装oracle客户端
      

  4.   

    是一个好方法。我决定自己写一个oci调用不用odac