简体   繁体   English

ORA-01843:更新时oracle中没有有效的月份错误

[英]ORA-01843: not a valid month error in oracle while updating

I want to update my date column with the format as dd-mm-yy . 我想更新我的日期列,格式为dd-mm-yy And in my database the column is of date datatype. 在我的数据库中,该列是date数据类型。 So while Updating I am sending data as 因此,在更新时我将数据发送为

05-12-2017 but getting error as 05-12-2017但是得到错误

ORA-01843: not a valid month ORA-01843:不是有效月份

in my stored procedure I am sending it as 在我的存储过程中,我发送它

HOTO_ACCEPTENCE_DATE = TO_DATE(PHOTO_ACCEPTENCE_DATE, 'dd-m-yy'),

My full procedure: 我的完整程序:

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;

update 更新

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;

Also the error details 还有错误的详细信息

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) in 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 bCheck)在D:\\中的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)的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 Nadeem \\ FiberInventory_214 \\ FiberInventoryPortal \\ FiberInventoryPortal \\ Models \\ DAL \\ DBObject.cs:第114行

HOTO_ACCEPTENCE_DATE = TO_DATE(PHOTO_ACCEPTENCE_DATE, 'DD-MM-YY')

TO_DATE( date_string, format_model, nls_params ) takes a string as the first argument so Oracle must implicitly convert a non-string argument to a string and is effectively doing: 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'
                       )

If the NLS_DATE_FORMAT session parameter does not match DD-MM-YY then you will get an error. 如果NLS_DATE_FORMAT会话参数与DD-MM-YY不匹配,则会出现错误。 Since the NLS_DATE_FORMAT is a session parameter and can be changed by each user then relying on this is one way for your code to start raising exception as the users change their settings without your code ever changing. 由于NLS_DATE_FORMAT是一个会话参数,并且可以由每个用户更改,因此依赖于此是代码开始引发异常的一种方法,因为用户在不更改代码的情况下更改其设置。

What you want to do is just use: 你想要做的只是使用:

HOTO_ACCEPTENCE_DATE = PHOTO_ACCEPTENCE_DATE,

As you do not need to convert a date to anything when you are storing it as a date. 因为当您将日期存储为日期时,您不需要将日期转换为任何内容。

I want to update my date column with the format as dd-mm-yy . 我想更新我的日期列,格式为dd-mm-yy

A date does not have a format - it is stored internally to the database as 7-bytes (representing year, month, day, hour, minute and second) and it is not until whatever user interface you are using (ie SQL/Plus, SQL Developer, Java, etc) tries to display it to you, the user, and converts it into something you would find meaningful (usually a string) that the date has a format. 日期没有格式 - 它以7字节 (代表年,月,日,小时,分钟和秒)的内部存储在数据库中,直到您使用的是任何用户界面(即SQL / Plus, SQL Developer,Java等尝试将它显示给您,即用户,并将其转换为您认为有效的(通常是字符串)日期具有格式的内容。

You can try using 你可以尝试使用

HOTO_ACCEPTENCE_DATE = TO_DATE(PHOTO_ACCEPTENCE_DATE, 'dd-mm-yy'),

see the document for possible combinations 请参阅文档以了解可能的组合

Considering the format you posted, 'dd-m-yy' , it seems that the month part is incorrect. 考虑到您发布的格式'dd-m-yy' ,似乎月份部分不正确。 It should be MM instead of M . 它应该是MM而不是M

Ref.: https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm 参考: https//docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM