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筆記錄時報這個錯誤,數據的格式都是一樣的,所以應該不會是數據問題.
請教大家是什麼原因.?
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筆記錄時報這個錯誤,數據的格式都是一樣的,所以應該不會是數據問題.
請教大家是什麼原因.?
PL/SQL developer还是toad?
如果是toad 请将RetVal 改大
// *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行的数据有问题,把数据贴上来看看
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();
}
}
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;
測試儲存過程,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
請問大家這是什麼原因?
是你调用的参数错了这个错常看到
clob類型在进行字符串操作的的时候貌似是有长度限制的你可以查一下