我使用DataStudio建立了一个PL/SQL程序包,名为PKG_TEST, 然后在里面创建了一个存储过程P_TEST,这个存储过程有两个输入参数,作用是返回一个结果集。
Package定义如下:规范部分:CREATE OR REPLACE PACKAGE PKG_TEST AS
    TYPE cur IS REF CURSOR;    PROCEDURE P_SREFER (
        P_PLANID        IN      T_PRODUCINGPLAN.PLANID%TYPE,
        P_STATE         IN      T_PRODUCINGPLAN.PLAN_STATE%TYPE,        P_CUR           OUT     cur
    );
END PKG_TEST ;主体部分:CREATE OR REPLACE PACKAGE BODY PKG_TEST AS
    PROCEDURE P_SREFER (
        P_PLANID        IN      T_PRODUCINGPLAN.PLANID%TYPE,
        P_STATE         IN      T_PRODUCINGPLAN.PLAN_STATE%TYPE,
                P_CUR           OUT     V_CUR
    )
    IS
    BEGIN
        OPEN P_CUR FOR SELECT
            PLANID,             --计划号
            PLAN_STATE,         --状态
            PROC_STATE,         --执行状态
            SPEC,               --钢种
            WORKFLOW,           --生产路径            SEQNO,              --顺序号
            INS_EMP              --录入人
                FROM T_PRODUCINGPLAN
                    WHERE
                            PLANID LIKE P_PLANID || '%'
                        AND
                            PROC_STATE LIKE P_STATE || '%'     -- 计划执行状态.
                    ORDER BY SEQNO, PLANID ASC;
    END P_SREFER;
End PKG_TEST ;前台对应对应C#代码如下:                ds = new DataSet();
                OleDbConn = new DB2Connection();
                OleDbAdp = new DB2DataAdapter();
                string iniConnectString = "Database=testdb;User ID=db2admin;Password=sa;Server=localhost:50000";
                OleDbConn.ConnectionString = iniConnectString;                OleDbConn.Open();
                OleDbAdp = new DB2DataAdapter("call PKG_TEST.P_TEST('1','A')", OleDbConn);
                OleDbAdp.Fill(ds, "TableS");报错如下:
ERROR [42884] [IBM][DB2/NT] SQL0440N  找不到具有兼容自变量的类型为 "PROCEDURE" 的名为 "PKG_TEST.P_TEST" 的已授权例程。  SQLSTATE=42884

解决方案 »

  1.   

    如果用户在运行包含 DB2 自带函数的 SQL 语句时,如下述使用了 ABS 函数的查询语句:db2 select prodname, abs(margin) from prodlist 遇到 SQL0440N 的错误:SQL0440N 在函数路径中找不到名称为 "ABS" 且带兼容自变量的函数。 SQLSTATE=42884 使用命令:db2 ? sql0440n 查看错误的解释时,得到如下得输出内容:SQL0440N 找不到具有兼容自变量的类型为“<例程类型>”的名为“<例程名>”的已授权例程。解释:当数据库管理器找不到可用来实现引用的例程时,若引用例程“ <例程名>” ,则会发生此错误。引起此错误的原因有下列几个:

    :从输出信息中对问题原因的解释可以发现,导致这一问题的原因有多种,当用户将所列示的原因逐条检查后,却发现这些都不是导致自己当前所遇到的 SQL0440N 错误的原因,此时可考虑另外一个 SQL0440N 解释信息中未提到的一种情况:即当函数的创建时间晚于系统的当前时间,同样会出现该报错。为检查问题,用户可利用下面的 SQL 语句对各函数创建的时间戳选项 CREATE_TIME 进行查询:db2 select funcschema, funcname, create_time from syscat.functions 如果存在某些函数的创建时间晚于当前系统时间的情况,例如用户误置系统的时间为过去某个时间,而使用的函数的创建时间又晚于这一时间,便会在运行相关 SQL 语句时遇到 SQL0440N 的报错。解决这一问题的方法很简单,用户只要重新正确地设置操作系统的当前时间,使它晚于 DB2 自带函数的创建时间即可。
      

  2.   

    OracleCommand cmdInsert = con.CreateCommand();
                    cmdInsert.CommandText = "oper_blacklistpacket.InsertBlackListInfo";
                    cmdInsert.CommandType = CommandType.StoredProcedure;                cmdInsert.Parameters.Add("p_ID", OracleType.Number).Direction = ParameterDirection.Output;
                    cmdInsert.Parameters.AddWithValue("p_VehicleNo", blackListInfo.VehicleNo);
                    cmdInsert.Parameters.AddWithValue("p_Submitter", blackListInfo.Submitter);
                    cmdInsert.Parameters.AddWithValue("p_LockReason", blackListInfo.LockReason);                con.Open();
                    cmdInsert.ExecuteNonQuery();
    参照一下我这个写法,绝对没有错
    别忘了给分,呵呵!