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是什么值?
打个断点
出错时param是什么值?
#7
傳入的數據應該沒有問題
#8
应该是你的java程序对参数的处理有问题,把sql在控制台给打印出来看看.
#9
我用的是c#,代碼都貼出來了.
#10
最容易出错的就是日期格式
#11
做插入时,数据类型不对
#12
那為什麼我測試儲存過程沒問題?
#13
我把日期全部用DATE型,還是報同樣的錯誤
#14
参数类型和个数不匹配啦,好好核对一下就可以找出问题啦
#15
LZ说验证通过,很好还原场景,如,ot_no 类型为number,你测试的时候,传入的自然是合法值,1234,varchar能强行转换成number,验证通过;
假设应用中如果传入a,则强行转换出错,抛出异常。
建议把参数定义成列对应的类型,在传入参数时判断类型。
假设应用中如果传入a,则强行转换出错,抛出异常。
建议把参数定义成列对应的类型,在传入参数时判断类型。
#16
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
晕。又不是仅仅涉及到这一个表,每个表的类型都要检查一遍。
像这样的:
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
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
其他表的類型和這個是一樣的
#22
是哦
#23
单独调试存储过程不报错说明存储过程是好的, 所以问题就是 调用存储过程的时候传入的参数个数不对
#24
我用傳入的參數值放在儲存過程裡面調試是Ok的.
#25
大家指教啊!
#26
报啥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是什么值?
打个断点
出错时param是什么值?
#7
傳入的數據應該沒有問題
#8
应该是你的java程序对参数的处理有问题,把sql在控制台给打印出来看看.
#9
我用的是c#,代碼都貼出來了.
#10
最容易出错的就是日期格式
#11
做插入时,数据类型不对
#12
那為什麼我測試儲存過程沒問題?
#13
我把日期全部用DATE型,還是報同樣的錯誤
#14
参数类型和个数不匹配啦,好好核对一下就可以找出问题啦
#15
LZ说验证通过,很好还原场景,如,ot_no 类型为number,你测试的时候,传入的自然是合法值,1234,varchar能强行转换成number,验证通过;
假设应用中如果传入a,则强行转换出错,抛出异常。
建议把参数定义成列对应的类型,在传入参数时判断类型。
假设应用中如果传入a,则强行转换出错,抛出异常。
建议把参数定义成列对应的类型,在传入参数时判断类型。
#16
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
晕。又不是仅仅涉及到这一个表,每个表的类型都要检查一遍。
像这样的:
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
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
其他表的類型和這個是一樣的
#22
是哦
#23
单独调试存储过程不报错说明存储过程是好的, 所以问题就是 调用存储过程的时候传入的参数个数不对
#24
我用傳入的參數值放在儲存過程裡面調試是Ok的.
#25
大家指教啊!
#26
报啥ora错误啊,能贴出来吗