請問這是什麼問題?

时间:2022-12-22 16:04:16
儲存過程
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 remark)
        {
            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 = remark;
            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
請問這是什麼原因?

26 个解决方案

#1


看你的错误提示,是在做插入时,数据类型不对

#2


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

#3


看你的错误提示,是在做插入时,数据类型不对

#4


这行的错吧,数据列的类型和值的类型不一致
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);

#5


可是我測試儲存過程是ok的啊

#6


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

#7


引用 6 楼 Robin_Ares 的回复:
在 orcl.ExecuteProcedure("PKG_BENDDY.INSERT_DOC_INFO", param);
打个断点
出错时param是什么值?

傳入的數據應該沒有問題

#8


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

#9


引用 8 楼 sleepzzzzz 的回复:
应该是你的java程序对参数的处理有问题,把sql在控制台给打印出来看看.

我用的是c#,代碼都貼出來了.

#10


最容易出错的就是日期格式

#11


做插入时,数据类型不对

#12


引用 11 楼 suncrafted 的回复:
做插入时,数据类型不对

那為什麼我測試儲存過程沒問題?

#13


引用 10 楼 hebo2005 的回复:
最容易出错的就是日期格式

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

#14


参数类型和个数不匹配啦,好好核对一下就可以找出问题啦

#15


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

建议把参数定义成列对应的类型,在传入参数时判断类型。

#16


引用 15 楼 jdsnhan 的回复:
LZ说验证通过,很好还原场景,如,ot_no 类型为number,你测试的时候,传入的自然是合法值,1234,varchar能强行转换成number,验证通过;
假设应用中如果传入a,则强行转换出错,抛出异常。

建议把参数定义成列对应的类型,在传入参数时判断类型。

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  --加班原因 

#17


应该是数据类型不对,查查看
請問這是什麼問題?

#18


你单步调试下存储过程,跟踪下每个变量的值

#19


引用 16 楼 yesefuhua 的回复:
引用 15 楼 jdsnhan 的回复:
LZ说验证通过,很好还原场景,如,ot_no 类型为number,你测试的时候,传入的自然是合法值,1234,varchar能强行转换成number,验证通过; 
假设应用中如果传入a,则强行转换出错,抛出异常。 

建议把参数定义成列对应的类型,在传入参数时判断类型。 
 
create table DOC_INFO 

  DOC_ID        NUMBER not null, 
  DOC_TYPE_ID  NUMBER not null, 
  DOC_NO        VARCHAR2(13) no…


晕。又不是仅仅涉及到这一个表,每个表的类型都要检查一遍。
像这样的:
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一下,看看传入的参数。

#20


引用 14 楼 Richard345265669 的回复:
参数类型和个数不匹配啦,好好核对一下就可以找出问题啦


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 

#21


引用 19 楼 jdsnhan 的回复:
建议把参数定义成列对应的类型,在传入参数时判断类型。

其他表的類型和這個是一樣的

#22


引用 2 楼 sleepzzzzz 的回复:
PLS-00306: wrong number or types of arguments in call to 'INSERT_DOC_INFO' 
------------------------- 
传参的类型或者参数个数不对 


是哦

#23


单独调试存储过程不报错说明存储过程是好的, 所以问题就是 调用存储过程的时候传入的参数个数不对

#24


引用 23 楼 lwmonster 的回复:
单独调试存储过程不报错说明存储过程是好的, 所以问题就是 调用存储过程的时候传入的参数个数不对

我用傳入的參數值放在儲存過程裡面調試是Ok的.

#25


大家指教啊!

#26


引用 24 楼 yesefuhua 的回复:
引用 23 楼 lwmonster 的回复:
单独调试存储过程不报错说明存储过程是好的, 所以问题就是 调用存储过程的时候传入的参数个数不对 
 
我用傳入的參數值放在儲存過程裡面調試是Ok的.


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

#1


看你的错误提示,是在做插入时,数据类型不对

#2


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

#3


看你的错误提示,是在做插入时,数据类型不对

#4


这行的错吧,数据列的类型和值的类型不一致
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);

#5


可是我測試儲存過程是ok的啊

#6


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

#7


引用 6 楼 Robin_Ares 的回复:
在 orcl.ExecuteProcedure("PKG_BENDDY.INSERT_DOC_INFO", param);
打个断点
出错时param是什么值?

傳入的數據應該沒有問題

#8


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

#9


引用 8 楼 sleepzzzzz 的回复:
应该是你的java程序对参数的处理有问题,把sql在控制台给打印出来看看.

我用的是c#,代碼都貼出來了.

#10


最容易出错的就是日期格式

#11


做插入时,数据类型不对

#12


引用 11 楼 suncrafted 的回复:
做插入时,数据类型不对

那為什麼我測試儲存過程沒問題?

#13


引用 10 楼 hebo2005 的回复:
最容易出错的就是日期格式

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

#14


参数类型和个数不匹配啦,好好核对一下就可以找出问题啦

#15


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

建议把参数定义成列对应的类型,在传入参数时判断类型。

#16


引用 15 楼 jdsnhan 的回复:
LZ说验证通过,很好还原场景,如,ot_no 类型为number,你测试的时候,传入的自然是合法值,1234,varchar能强行转换成number,验证通过;
假设应用中如果传入a,则强行转换出错,抛出异常。

建议把参数定义成列对应的类型,在传入参数时判断类型。

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  --加班原因 

#17


应该是数据类型不对,查查看
請問這是什麼問題?

#18


你单步调试下存储过程,跟踪下每个变量的值

#19


引用 16 楼 yesefuhua 的回复:
引用 15 楼 jdsnhan 的回复:
LZ说验证通过,很好还原场景,如,ot_no 类型为number,你测试的时候,传入的自然是合法值,1234,varchar能强行转换成number,验证通过; 
假设应用中如果传入a,则强行转换出错,抛出异常。 

建议把参数定义成列对应的类型,在传入参数时判断类型。 
 
create table DOC_INFO 

  DOC_ID        NUMBER not null, 
  DOC_TYPE_ID  NUMBER not null, 
  DOC_NO        VARCHAR2(13) no…


晕。又不是仅仅涉及到这一个表,每个表的类型都要检查一遍。
像这样的:
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一下,看看传入的参数。

#20


引用 14 楼 Richard345265669 的回复:
参数类型和个数不匹配啦,好好核对一下就可以找出问题啦


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 

#21


引用 19 楼 jdsnhan 的回复:
建议把参数定义成列对应的类型,在传入参数时判断类型。

其他表的類型和這個是一樣的

#22


引用 2 楼 sleepzzzzz 的回复:
PLS-00306: wrong number or types of arguments in call to 'INSERT_DOC_INFO' 
------------------------- 
传参的类型或者参数个数不对 


是哦

#23


单独调试存储过程不报错说明存储过程是好的, 所以问题就是 调用存储过程的时候传入的参数个数不对

#24


引用 23 楼 lwmonster 的回复:
单独调试存储过程不报错说明存储过程是好的, 所以问题就是 调用存储过程的时候传入的参数个数不对

我用傳入的參數值放在儲存過程裡面調試是Ok的.

#25


大家指教啊!

#26


引用 24 楼 yesefuhua 的回复:
引用 23 楼 lwmonster 的回复:
单独调试存储过程不报错说明存储过程是好的, 所以问题就是 调用存储过程的时候传入的参数个数不对 
 
我用傳入的參數值放在儲存過程裡面調試是Ok的.


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