儲存過程
PROCEDURE INSERT_DOC_INFO
  (
      V_NO        VARCHAR2,  --單據號
      V_FACT_NO  VARCHAR2,  --廠別
      V_REMARK    VARCHAR2  --加班原因
  )
  AS
  V_DEPT_NO          VARCHAR2(6);  --申請部門
  V_EMPLOYEE_NO      VARCHAR2(20); --申請員工
  V_PREP1            DATE;        --加班起始時間
  V_PREP2            DATE;        --加班結束時間
  V_PREP3            NUMBER(3,1);  --加班時數
  V_STR              CLOB;        --xml
  V_DEPT_NAME        VARCHAR2(50); --申請部門名稱
  V_FACT_NAME        VARCHAR2(50); --申請廠別
  V_EMP_NAME        VARCHAR2(50); --員工姓名
  V_REVISE_DATE      VARCHAR2(10); --申請日期
  V_OT_DATE          VARCHAR2(10); --加班日期
  V_VAR              VARCHAR2(2);  --雙引號   
  BEGIN
  V_VAR:='"';
  --找出申請部門,申請人,加班日期,申請日期
  SELECT DEPT_NO,REVISOR,TO_CHAR(OT_DATE,'yyyy/MM/dd'),TO_CHAR(REVISE_DATE,'yyyy/MM/dd') INTO V_DEPT_NO,V_EMPLOYEE_NO,V_OT_DATE,V_REVISE_DATE FROM HRA_OT_MAST WHERE OT_NO=V_NO;
  --獲取廠別名稱
  SELECT FACTORY_NAME INTO V_FACT_NAME FROM HR_FACTORY@EIP2HRERP WHERE FACTORY_NO=V_FACT_NO;
  --獲取部門名稱
  SELECT DEPT_NAME INTO V_DEPT_NAME FROM HR_DEPT@EIP2HRERP WHERE DEPT_NO=V_DEPT_NO;
  --定義xml頭
  V_STR :=' <?xml version='||V_VAR||'1.0'||V_VAR||' encoding='||V_VAR||'utf-8'||V_VAR||'?> <TXML xmlns:xsi='||V_VAR||'http://www.w3.org/2001/XMLSchema-instance'||V_VAR||' xsi:noNamespaceSchemaLocation='||V_VAR||'GCOW.xsd'||V_VAR||'>';
  V_STR :=V_STR||' <FORM> <APPLY_KEY> <PARAM> <FACTNO>'||V_FACT_NO||' </FACTNO> <FORMNO>'||v_no||' </FORMNO>';
  V_STR :=V_STR||' <SYSTEMCODE>GC </SYSTEMCODE> <FORMCODE>GCOW </FORMCODE> <USER>'||V_EMPLOYEE_NO||' </USER> </PARAM> <USERKEY> <KEY3> </KEY3> <KEY4/> <KEY5/> <KEY6/> <KEY7/> <KEY8/> <KEY9/> <KEY10/> <KEY11/> <LKEY1/> </USERKEY> </APPLY_KEY>';
  V_STR :=V_STR||' <CONTENT> <M> <廠>'||V_FACT_NAME||' </廠> <科>'||V_DEPT_NAME||' </科> <組> </組> <加班日期>'||V_OT_DATE||' </加班日期> <申請日期>'||V_REVISE_DATE||' </申請日期> <«保安記錄> </«保安記錄> </M> <D>';
  --獲取起始加班時間及加班時數
  SELECT BEG_TIME,END_TIME,OT_HOURS INTO V_PREP1,V_PREP2,V_PREP3 FROM HRA_OT_ITEM WHERE OT_NO=V_NO AND ROWNUM=1;
  --加入到xml
  DECLARE CURSOR CUR IS SELECT EMP_NO,TO_CHAR(BEG_TIME,'yyyy/MM/dd HH24:mi')as BEG_TIME,TO_CHAR(END_TIME,'yyyy/MM/dd HH24:mi')as END_TIME,TRIM(TO_CHAR(OT_HOURS,'99.9')) AS OT_HOURS FROM HRA_OT_ITEM WHERE OT_NO=V_NO;
  BEGIN
  FOR ITEM IN CUR
  LOOP
  SELECT EMP_NAME INTO V_EMP_NAME FROM HR_BASICINFO@EIP2HRERP WHERE EMP_NO=ITEM.EMP_NO;
  V_STR :=V_STR||' <數據項> <工號>'||ITEM.EMP_NO||' </工號> <姓名>'||V_EMP_NAME||' </姓名> <起訖日期>'||ITEM.BEG_TIME||' </起訖日期> <加班內容>'||V_REMARK||' </加班內容> <實際下班時>'||ITEM.END_TIME||' </實際下班時> <加班時數>'||ITEM.OT_HOURS||' </加班時數> </數據項>';
  END LOOP;
  END;
  V_STR :=V_STR||' </D> </CONTENT> <MESSAGE> <RESULT> </RESULT> <CONTENT> </CONTENT> </MESSAGE> </FORM> </TXML>';
  INSERT INTO DOC_INFO(DOC_TYPE_ID,DOC_NO,FACT_NO,DEPT_NO,EMPLOYEE_NO,APPLY_DATE,XML,REMARK,PREP1,PREP2,PREP3)
        VALUES(1,V_NO,V_FACT_NO,V_DEPT_NO,V_EMPLOYEE_NO,TO_DATE(V_REVISE_DATE,'yyyy/MM/dd'),V_STR,V_REMARK,V_PREP1,V_PREP2,V_PREP3);
  END INSERT_DOC_INFO;頁面調用代碼
public void Insert_doc_info(string no,string fact_no,string re)
        {
            OracleParameter[] param = new OracleParameter[]
                                    {
                new OracleParameter("V_NO",OracleType.VarChar),
                new OracleParameter("V_FACT_NO",OracleType.VarChar),
                new OracleParameter("V_REMRK",OracleType.VarChar)
                                    };
            param[0].Value = no;
            param[1].Value = fact_no;
            param[2].Value = re;
            param[0].Direction = ParameterDirection.Input;
            param[1].Direction = ParameterDirection.Input;
            param[2].Direction = ParameterDirection.Input;
            orcl.ExecuteProcedure("PKG_BENDDY.INSERT_DOC_INFO", param);
        } 數據訪問方法
public void ExecuteProcedure(string sprocName, OracleParameter[] parameters)
    {
        conn = GetConnection();
        try
        {
            //給command分配空間
            cmd = new OracleCommand();
            //建立連接
            cmd.Connection = conn;
            //打開數據庫連接
            conn.Open();
            //給commandText賦值
            cmd.CommandText = sprocName;
            //指明commandtype類型為儲存過程類型
            cmd.CommandType = CommandType.StoredProcedure;
            //創建oracleParameterCollection 對象并賦值
            OracleParameterCollection sqlParams = cmd.Parameters;
            //清空command參數空間的值
            cmd.Parameters.Clear();
            //循環添加參數到parameters
            foreach (OracleParameter parameter in parameters)
            {
                cmd.Parameters.Add(parameter);
            }
            //執行OracleCommand
            cmd.ExecuteNonQuery();
        }
        catch (Exception e)
        {
            throw (e);
        }
        finally
        {
            conn.Close();
        }
    }測試儲存過程,ok.
頁面調用時報如下錯誤:
ORA-06550: 第 1 行, 第 7 個欄位:
PLS-00306: wrong number or types of arguments in call to 'INSERT_DOC_INFO'
ORA-06550: 第 1 行, 第 7 個欄位:
PL/SQL: Statement ignored
請問這是什麼原因?

解决方案 »

  1.   

    PLS-00306: wrong number or types of arguments in call to 'INSERT_DOC_INFO' 
    -------------------------
    传参的类型或者参数个数不对 
      

  2.   

    这行的错吧,数据列的类型和值的类型不一致
    INSERT INTO DOC_INFO(DOC_TYPE_ID,DOC_NO,FACT_NO,DEPT_NO,EMPLOYEE_NO,APPLY_DATE,XML,REMARK,PREP1,PREP2,PREP3) 
    VALUES(1,V_NO,V_FACT_NO,V_DEPT_NO,V_EMPLOYEE_NO,TO_DATE(V_REVISE_DATE,'yyyy/MM/dd'),V_STR,V_REMARK,V_PREP1,V_PREP2,V_PREP3);
      

  3.   

    在 orcl.ExecuteProcedure("PKG_BENDDY.INSERT_DOC_INFO", param); 
    打个断点
    出错时param是什么值?
      

  4.   

    应该是你的java程序对参数的处理有问题,把sql在控制台给打印出来看看.
      

  5.   

    我把日期全部用DATE型,還是報同樣的錯誤
      

  6.   

    LZ说验证通过,很好还原场景,如,ot_no 类型为number,你测试的时候,传入的自然是合法值,1234,varchar能强行转换成number,验证通过;
    假设应用中如果传入a,则强行转换出错,抛出异常。建议把参数定义成列对应的类型,在传入参数时判断类型。
      

  7.   

    create table DOC_INFO
    (
      DOC_ID        NUMBER not null,
      DOC_TYPE_ID   NUMBER not null,
      DOC_NO        VARCHAR2(13) not null,
      FACT_NO       VARCHAR2(4) not null,
      DEPT_NO       VARCHAR2(6) not null,
      EMPLOYEE_NO   VARCHAR2(20) not null,
      APPLY_DATE    DATE default SYSDATE not null,
      XML           CLOB,
      REMARK        VARCHAR2(200),
      AUDITING_FLAG NUMBER default 0 not null,
      PREP1         DATE,
      PREP2         DATE,
      PREP3         VARCHAR2(20),
      REVISOR       VARCHAR2(8),
      REVISE_DATE   DATE default SYSDATE not null,
      FLAG          NUMBER default 1 not null
    )
    這是我的表結構, 以下是傳入的參數列表,上面也有.
    V_NO        VARCHAR2,  --單據號
    V_FACT_NO   VARCHAR2,  --廠別
    V_REMARK    VARCHAR2  --加班原因 
      

  8.   


    晕。又不是仅仅涉及到这一个表,每个表的类型都要检查一遍。
    像这样的:
    SELECT DEPT_NO,REVISOR,TO_CHAR(OT_DATE,'yyyy/MM/dd'),TO_CHAR(REVISE_DATE,'yyyy/MM/dd') INTO V_DEPT_NO,V_EMPLOYEE_NO,V_OT_DATE,V_REVISE_DATE FROM HRA_OT_MAST WHERE OT_NO=V_NO; 你在调用时print一下,看看传入的参数。
      

  9.   


    create table DOC_INFO
    (
      DOC_ID        NUMBER not null,
      DOC_TYPE_ID  NUMBER not null,
      DOC_NO        VARCHAR2(13) not null,
      FACT_NO      VARCHAR2(4) not null,
      DEPT_NO      VARCHAR2(6) not null,
      EMPLOYEE_NO  VARCHAR2(20) not null,
      APPLY_DATE    DATE default SYSDATE not null,
      XML          CLOB,
      REMARK        VARCHAR2(200),
      AUDITING_FLAG NUMBER default 0 not null,
      PREP1        DATE,
      PREP2        DATE,
      PREP3        VARCHAR2(20),
      REVISOR      VARCHAR2(8),
      REVISE_DATE  DATE default SYSDATE not null,
      FLAG          NUMBER default 1 not null

    INSERT INTO DOC_INFO(DOC_TYPE_ID,DOC_NO,FACT_NO,DEPT_NO,EMPLOYEE_NO,APPLY_DATE,XML,REMARK,PREP1,PREP2,PREP3)
            VALUES(1,V_NO,V_FACT_NO,V_DEPT_NO,V_EMPLOYEE_NO,
    TO_DATE(V_REVISE_DATE,'yyyy/MM/dd'),V_STR,V_REMARK,V_PREP1,V_PREP2,V_PREP3);V_DEPT_NO          VARCHAR2(6);  --申請部門
      V_EMPLOYEE_NO      VARCHAR2(20); --申請員工
      V_PREP1            DATE;        --加班起始時間
      V_PREP2            DATE;        --加班結束時間
      V_PREP3            NUMBER(3,1);  --加班時數
      V_STR              CLOB;        --xml 
      

  10.   


    报啥ora错误啊,能贴出来吗