我的一个存储过程中要用到IN,存储过程如下
CREATE OR REPLACE PROCEDURE TEST
(
P_D_CODE VARCHAR2,
RETURN_VALUE OUT REDATASET.DS
)
AS
BEGIN
      dbms_output.put_line(P_D_CODE);
      OPEN RETURN_VALUE FOR
      'SELECT * FROM TTRD_BIDD_INFO B WHERE B.D_CODE IN ('||P_D_CODE||')';
END;参数P_D_CODE,我在plsql中调试的时候,传入'123','456'像这样的是对的,但是通过程序,调用这个存储过程时,总是报找不到表达式。请问各位大虾这是什么问题,我对oracle不是很熟。

解决方案 »

  1.   

    http://blog.csdn.net/fangxinggood/archive/2005/10/17/507989.aspx
      

  2.   

    程序加了'的,程序调用的封装的太多了传一段代码你看看,这是最后调用的地方 public ReportDesignerDataSet.ReportDesignDataTable QueryStoreProcedure(List<object> aParams, string aStoreProName, string aDBType)
            {
                string timeQuery = DateTime.Now.Ticks.ToString();
                Database db = null;
                switch (aDBType)
                {
                    case DatabaseType.APP:
                        db = DBFactory.APP;
                        break;
                    case DatabaseType.MD:
                        db = DBFactory.MD;
                        break;
                    case DatabaseType.TRD:
                        db = DBFactory.TRD;
                        break;
                    default:
                        break;
                }
                if (db == null)
                {
                    return null;
                }
                //Log4.LogHelper.Write(Log4.LogLevel.Debug, string.Format("{0},收到存储过程({1})请求, 请求时间点({2})。", USER_CODE, aStoreProName, timeQuery));
                DbCommand cmd = db.GetStoredProcCommand(aStoreProName);
                //Log4.LogHelper.Write(Log4.LogLevel.Debug, string.Format("{0},准备解析存储过程({1})参数, 请求时间点({2})。", USER_CODE, aStoreProName, timeQuery));
                db.DiscoverParameters(cmd);
                //Log4.LogHelper.Write(Log4.LogLevel.Debug, string.Format("{0},成功解析存储过程({1})参数, 准备传入参数, 请求时间点({2})。", USER_CODE, aStoreProName, timeQuery));            for (int i = 0; i < aParams.Count; i++)
                {
                    cmd.Parameters[i + 1].Value = aParams[i];
                    //Log4.LogHelper.Write(Log4.LogLevel.Debug, string.Format("{0},存储过程({1})参数{2}={3}传入成功, 请求时间点({4})。", USER_CODE, aStoreProName, cmd.Parameters[i + 1].ParameterName, aParams[i].ToString(), timeQuery));
                }            //廖正华 2010-07-01 LOGON_USER作为参数时,用当前登录用户将其代替
                foreach (DbParameter paramer in cmd.Parameters)
                {
                    if (paramer.ParameterName == "LOGON_USER")
                    {
                        paramer.Value = USER_CODE;
                    }
                }            //Log4.LogHelper.Write(Log4.LogLevel.Debug, string.Format("{0},准备查询存储过程({1}), 请求时间点({2})。", USER_CODE, aStoreProName, timeQuery));
                ReportDesignerDataSet.ReportDesignDataTable table = SimpleDal.Query<ReportDesignerDataSet.ReportDesignDataTable>(db, cmd);
                cmd.Dispose();
                //Log4.LogHelper.Write(Log4.LogLevel.Debug, string.Format("{0},成功查询存储过程({1}), 请求时间点({2})。", USER_CODE, aStoreProName, timeQuery));            return table;
            }
      

  3.   

    ORA-00936: missing expression
    ORA-06512: at "XIR_TRD_NC.TEST", line 10
    ORA-06512: at line 1感谢各位啊。
      

  4.   

    你的代码封装的太深了。只能一点点推了。
    cmd.Parameters[i + 1].Value = aParams[i];
    这里定义下ParameterDirection,尤其是OUT的。断点检查cmd.CommandType是否正确。另外,XIR_TRD_NC 是PL/SQL的body名?
      

  5.   

    是啊,代码封装的太深了,而且这个项目是我刚接手不久,代码量很大。
    XIR_TRD_NC是数据库用户名称。
      

  6.   

    pl/sql developer 或 toad
    调试,可以很方便找到语法错误和逻辑错误。 
    using   (OracleCommand   comm   =   new   OracleDbCommand   ( "select   *   from   Tb where   typeid=:typeid   order   by   createtime   desc   ",   conn)) 

    comm.Parameters.AddWithValue( ":typeid ",   typeid);