我想更新格式为dd-mm-yy
的日期列。在我的数据库中,该列为date
数据类型。因此,在更新时我将数据作为
05-12-2017
但是收到错误
ORA-01843:不是有效月份
在我的存储过程中,我将其作为
发送 HOTO_ACCEPTENCE_DATE = TO_DATE(PHOTO_ACCEPTENCE_DATE, 'dd-m-yy'),
我的完整程序:
PROCEDURE UPD_WF_BY_FIBER_ENG
(
PJOB_PROGRESS_ID IN TBL_FIBER_INV_JOB_PROGRESS.JOB_PROGRESS_ID%TYPE,
PSTATUS_ID IN TBL_FIBER_INV_JOB_PROGRESS.STATUS_ID%TYPE,
--PLIT_OFFERED_LENGTH IN TBL_FIBER_INV_JOB_PROGRESS.LIT_OFFERED_LENGTH%TYPE,
PHOTO_ACTUAL_LENGTH IN TBL_FIBER_INV_JOB_PROGRESS.HOTO_ACTUAL_LENGTH%TYPE,
PLIT_ACTUAL_LENGTH IN TBL_FIBER_INV_JOB_PROGRESS.LIT_ACTUAL_LENGTH%TYPE,
PHOTO_ACCEPTENCE_DATE IN TBL_FIBER_INV_JOB_PROGRESS.HOTO_ACCEPTENCE_DATE%TYPE,
PLIT_ACCEPTENCE_DATE IN TBL_FIBER_INV_JOB_PROGRESS.LIT_ACCEPTENCE_DATE%TYPE,
PAPPROVED_BY IN TBL_FIBER_INV_JOB_PROGRESS.APPROVED_BY%TYPE,
PREJECTED_BY IN TBL_FIBER_INV_JOB_PROGRESS.REJECTED_BY%TYPE,
PAPPROV_REJECT_REMARK IN TBL_FIBER_INV_JOB_PROGRESS.APPROV_REJECT_REMARK%TYPE,
PMODIFIED_BY IN TBL_FIBER_INV_JOB_PROGRESS.MODIFIED_BY%TYPE,
PUMS_GROUP_ASS_BY_ID IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_BY_ID%TYPE,
PUMS_GROUP_ASS_BY_NAME IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_BY_NAME%TYPE,
PUMS_GROUP_ASS_TO_ID IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_TO_ID%TYPE,
PUMS_GROUP_ASS_TO_NAME IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_TO_NAME%TYPE,
PISABDMISSING IN TBL_FIBER_INV_JOB_PROGRESS.ISABDMISSING%TYPE,
--PSPVENDORXML IN XMLTYPE,
POUTMSG OUT NVARCHAR2
)
AS
VCNTSPVENCNT NUMBER :=0;
BEGIN
UPDATE TBL_FIBER_INV_JOB_PROGRESS
SET STATUS_ID = PSTATUS_ID,
-- LIT_OFFERED_LENGTH = PLIT_OFFERED_LENGTH,
HOTO_ACTUAL_LENGTH = PHOTO_ACTUAL_LENGTH,
LIT_ACTUAL_LENGTH = PLIT_ACTUAL_LENGTH,
HOTO_ACCEPTENCE_DATE = TO_DATE(PHOTO_ACCEPTENCE_DATE, 'DD-MM-YY'),
LIT_ACCEPTENCE_DATE = TO_DATE(PLIT_ACCEPTENCE_DATE, 'DD-MM-YY'),
APPROVED_BY = PAPPROVED_BY,
APPROVED_DATE = DECODE(PAPPROVED_BY,NULL,NULL,SYSDATE),
REJECTED_BY = PREJECTED_BY,
REJECTED_DATE = DECODE(PREJECTED_BY,NULL,NULL,SYSDATE),
APPROV_REJECT_REMARK = PAPPROV_REJECT_REMARK,
MODIFIED_BY = PMODIFIED_BY,
MODIFIED_DATE = SYSDATE,
UMS_GROUP_ASS_BY_ID = PUMS_GROUP_ASS_BY_ID,
UMS_GROUP_ASS_BY_NAME = PUMS_GROUP_ASS_BY_NAME,
UMS_GROUP_ASS_TO_ID = PUMS_GROUP_ASS_TO_ID,
UMS_GROUP_ASS_TO_NAME = PUMS_GROUP_ASS_TO_NAME,
ISABDMISSING = PISABDMISSING
WHERE JOB_PROGRESS_ID = PJOB_PROGRESS_ID;
更新
try
{
DBObject ObjDBObject = new DBObject(strConnectionString);
string strProcedureName = strPackageName + ".UPD_WF_BY_FIBER_ENG";
List<OracleParameter> lstParameters = new List<OracleParameter>();
OracleParameter ObjOracleParameter = new OracleParameter("PJOB_PROGRESS_ID", FiberDataInsertion.PROG_ID);
OracleParameter ObjOracleParameter1 = new OracleParameter("PSTATUS_ID", 1);
OracleParameter ObjOracleParameter2 = new OracleParameter("PHOTO_ACTUAL_LENGTH", FiberDataInsertion.HOTO_ACTUAL_LENGTH);
OracleParameter ObjOracleParameter3 = new OracleParameter("PLIT_ACTUAL_LENGTH", FiberDataInsertion.LIT_ACTUAL_LENGTH);
OracleParameter ObjOracleParameter4 = new OracleParameter("PHOTO_ACCEPTENCE_DATE", FiberDataInsertion.HOTO_ACCP_DATE);
OracleParameter ObjOracleParameter5 = new OracleParameter("PLIT_ACCEPTENCE_DATE", FiberDataInsertion.LIT_ACCP_DATE);
OracleParameter ObjOracleParameter6 = new OracleParameter("PAPPROVED_BY", "NADEEM5.KHAN");
OracleParameter ObjOracleParameter7 = new OracleParameter("PREJECTED_BY", "DB");
OracleParameter ObjOracleParameter8 = new OracleParameter("PAPPROV_REJECT_REMARK", "this is test");
OracleParameter ObjOracleParameter9 = new OracleParameter("PMODIFIED_BY", FiberDataInsertion.MODIFIED_BY);
OracleParameter ObjOracleParameter10 = new OracleParameter("PUMS_GROUP_ASS_BY_ID", FiberDataInsertion.UMS_GROUP_ASS_BY_ID);
OracleParameter ObjOracleParameter11 = new OracleParameter("PUMS_GROUP_ASS_BY_NAME", FiberDataInsertion.UMS_GROUP_ASS_BY_NAME);
OracleParameter ObjOracleParameter12 = new OracleParameter("PUMS_GROUP_ASS_TO_ID", FiberDataInsertion.UMS_GROUP_ASS_TO_ID);
OracleParameter ObjOracleParameter13 = new OracleParameter("PUMS_GROUP_ASS_TO_NAME", FiberDataInsertion.UMS_GROUP_ASS_TO_NAME);
OracleParameter ObjOracleParameter14 = new OracleParameter("PISABDMISSING", FiberDataInsertion.MISS_ASBUILT);
OracleParameter ObjOracleParameter15 = new OracleParameter
{
ParameterName = "POUTMSG",
Size = 500,
OracleDbType = OracleDbType.NVarchar2,
Direction = ParameterDirection.Output
};
lstParameters.Add(ObjOracleParameter);
lstParameters.Add(ObjOracleParameter1);
lstParameters.Add(ObjOracleParameter2);
lstParameters.Add(ObjOracleParameter3);
lstParameters.Add(ObjOracleParameter4);
lstParameters.Add(ObjOracleParameter5);
lstParameters.Add(ObjOracleParameter6);
lstParameters.Add(ObjOracleParameter7);
lstParameters.Add(ObjOracleParameter8);
lstParameters.Add(ObjOracleParameter9);
lstParameters.Add(ObjOracleParameter10);
lstParameters.Add(ObjOracleParameter11);
lstParameters.Add(ObjOracleParameter12);
lstParameters.Add(ObjOracleParameter13);
lstParameters.Add(ObjOracleParameter14);
lstParameters.Add(ObjOracleParameter15);
strMessage = ObjDBObject.ExecuteNonQuery(strProcedureName, lstParameters);
}
catch (Exception)
{
throw;
}
return strMessage;
还有错误详情
d:\ Nadeem \ FiberInventory_214 \ FiberInventoryPortal \ FiberInventoryPortal \ Models \ DAL \ DBObject.cs:line 114`中的 at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck)
at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
at FiberInventoryPortal.Models.DAL.DBObject.ExecuteNonQuery(String strProcedureName, List
1 lstParameters)
答案 0 :(得分:3)
HOTO_ACCEPTENCE_DATE = TO_DATE(PHOTO_ACCEPTENCE_DATE, 'DD-MM-YY')
TO_DATE( date_string, format_model, nls_params )
将字符串作为第一个参数,因此Oracle必须将非字符串参数隐式转换为字符串,并且实际上是这样做的:
HOTO_ACCEPTENCE_DATE = TO_DATE(
TO_CHAR(
PHOTO_ACCEPTENCE_DATE,
( SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
),
'DD-MM-YY'
)
如果NLS_DATE_FORMAT
会话参数与DD-MM-YY
不匹配,那么您将收到错误消息。由于NLS_DATE_FORMAT
是一个会话参数,并且可以由每个用户更改,因此依赖于此是代码在用户更改其设置时开始引发异常的一种方式,而代码不会发生变化。
您想要做的只是使用:
HOTO_ACCEPTENCE_DATE = PHOTO_ACCEPTENCE_DATE,
当您将日期存储为日期时,您不需要将日期转换为任何内容。
我想更新我的日期列,格式为
dd-mm-yy
。
日期没有格式 - 它是stored internally to the database as 7-bytes(表示年,月,日,小时,分钟和秒),直到您使用的是任何用户界面(即SQL / Plus,SQL)开发人员,Java等)尝试将它显示给您,即用户,并将其转换为您会发现日期具有格式的有意义(通常是字符串)的内容。
答案 1 :(得分:0)
答案 2 :(得分:0)
考虑到您发布的格式'dd-m-yy'
,似乎月份部分不正确。它应该是MM
而不是M
。
参考: https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm