DECLARE CURSOR CUR IS SELECT EMP_NO,BEG_TIME,END_TIME,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_ST我定義的類型是CLOB,所以應該不會有空間不夠的問題,調試得知它運行到添加第68筆記錄時報這個錯誤,數據的格式都是一樣的,所以應該不會是數據問題.
請教大家是什麼原因.?

解决方案 »

  1.   

    看你的代码是要将数据转化成 XML的格式吧?
      

  2.   

    把ITEM.BEG_TIME和ITEM.END_TIME用to_char轉化后試一下
      

  3.   

    ora-06502 數字或值錯誤  后面应该还有详细的错误信息吧?1.既然你肯定你的变量没有问题,那么请问你使用什么工具做PL/SQL?
    PL/SQL developer还是toad?
    如果是toad 请将RetVal 改大
      

  4.   

    06502, 00000, "PL/SQL: numeric or value error%s"
    // *Cause: An arithmetic, numeric, string, conversion, or constraint error
    //         occurred. For example, this error occurs if an attempt is made to
    //         assign the value NULL to a variable declared NOT NULL, or if an
    //         attempt is made to assign an integer larger than 99 to a variable
    //         declared NUMBER(2).   
    // *Action: Change the data, how it is manipulated, or how it is declared so
    //          that values do not violate constraints. 第68行的数据有问题,把数据贴上来看看
      

  5.   

    頁面調用代碼
    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);
            }
      

  6.   

    數據訪問方法
    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();
            }
        }
      

  7.   

    儲存過程
     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;
      

  8.   

    clob類型已經很大了吧,應該不是這個問題.
    測試儲存過程,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
    請問大家這是什麼原因?
      

  9.   

    ORA-06550: 第 1 行, 第 7 個欄位: 
    是你调用的参数错了这个错常看到
      

  10.   

    还有
    clob類型在进行字符串操作的的时候貌似是有长度限制的你可以查一下