Oracle 样本数据-“;执行包含update和insert语句的存储过程时发出;

Oracle 样本数据-“;执行包含update和insert语句的存储过程时发出;,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,下面是关于“执行包含update和insert语句的存储过程时出现问题”的问题的示例表和文件详细信息。以下是我在执行过程之前遵循的步骤 我将从供应商处获得一个文件,其中包含以下格式的数据 6437,,01/01/2017,3483.92,, 14081,,01/01/2017,8444.23,, LSE_ID AST_ID PRPRTY_TAX_DDCTN_CD LIEN_DT ASES_PRT_1_AM ASES_PRT_2_AM 5868087 5049 Null

下面是关于“执行包含update和insert语句的存储过程时出现问题”的问题的示例表和文件详细信息。以下是我在执行过程之前遵循的步骤

  • 我将从供应商处获得一个文件,其中包含以下格式的数据

    6437,,01/01/2017,3483.92,,
    14081,,01/01/2017,8444.23,,
    
    LSE_ID  AST_ID PRPRTY_TAX_DDCTN_CD LIEN_DT    ASES_PRT_1_AM ASES_PRT_2_AM
    5868087 5049   Null                01-01-2017 3693.3        NULL
    
  • 我正在将这些数据加载到表
    NMAC\u PTMS\u NOTEBK\u SG
    。在上述文件中,第一列将是资产

  • 我正在使用该资产的名称为
    lse_id
    的额外列更新该表。现在
    NMAC\u PTMS\u NOTEBK\u SG
    表中的数据格式如下

    6437,,01/01/2017,3483.92,,
    14081,,01/01/2017,8444.23,,
    
    LSE_ID  AST_ID PRPRTY_TAX_DDCTN_CD LIEN_DT    ASES_PRT_1_AM ASES_PRT_2_AM
    5868087 5049   Null                01-01-2017 3693.3        NULL
    
  • 现在我的程序就要开始了。在我的程序中,逻辑应该是这样的:我需要从
    NMAC\u PTMS\u NOTEBK\u SG
    中获取
    lse\u id
    ,并在
    MJL
    表中比较相同的值(此处
    lse\u id=app\u lse\u s
    )。以下是MJL表的结构

    CREATE TABLE LPR_LP_TEST.MJL
    (
      APP_LSE_S     CHAR(10 BYTE)                   NOT NULL,
      DT_ENT_S      TIMESTAMP(3)                    NOT NULL, 
      DT_FOL_S      TIMESTAMP(3),
      NOTE_TYPE_S   CHAR(4 BYTE)                    NOT NULL,
      PRCS_C        CHAR(1 BYTE)                    NOT NULL,
      PRIO_C        CHAR(1 BYTE)                    NOT NULL,
      FROM_S        CHAR(3 BYTE)                    NOT NULL,
      TO_S          CHAR(3 BYTE)                    NOT NULL,
      NOTE_TITLE_S  VARCHAR2(41 BYTE)               NOT NULL,
      INFO_S        VARCHAR2(4000 BYTE),
      STAMP_L       NUMBER(10)                      NOT NULL,
      PRIVATE_C     CHAR(1 BYTE),
      LSE_ACC_C     CHAR(1 BYTE),
      COL_STAT_S    CHAR(4 BYTE),
      INFO1_S       VARCHAR2(250 BYTE),
      INFO2_S       VARCHAR2(250 BYTE),
      INFO3_S       VARCHAR2(250 BYTE),
      INFO4_S       VARCHAR2(250 BYTE),
      NTBK_RSN_S    CHAR(4 BYTE)
    )
    TABLESPACE LPR_LP_TEST
    PCTUSED    0
    PCTFREE    25
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
        INITIAL          64K
        NEXT             1M
        MINEXTENTS       1
        MAXEXTENTS       UNLIMITED
        PCTINCREASE      0
        BUFFER_POOL      DEFAULT
    )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    NOPARALLEL
    MONITORING;
    
    CREATE UNIQUE INDEX LPR_LP_TEST.MJL_IDX0 ON LPR_LP_TEST.MJL
    (APP_LSE_S, DT_ENT_S)
    LOGGING
    TABLESPACE LPR_LP_TEST
    PCTFREE    10
    INITRANS   2
    MAXTRANS   255
    STORAGE    (
        INITIAL          64K
        NEXT             1M
        MINEXTENTS       1
        MAXEXTENTS       UNLIMITED
        PCTINCREASE      0
        BUFFER_POOL      DEFAULT
    )
    NOPARALLEL;
    
    CREATE OR REPLACE TRIGGER LPR_LP_TEST."MT_MJL_AIUD" 
    AFTER INSERT OR UPDATE OR DELETE ON mjl
    BEGIN
    mpkg_trig_mjl.mp_mjl_aiud;
    END mt_mjl_aiud;
    / 
    
    CREATE OR REPLACE TRIGGER LPR_LP_TEST."MT_MJL_AIUDR" 
    AFTER INSERT OR UPDATE OR DELETE ON mjl FOR EACH ROW
    BEGIN
    mpkg_trig_mjl.mp_mjl_aiudr (INSERTING, UPDATING, DELETING,
                :NEW.app_lse_s, :NEW.prcs_c, :NEW.note_type_s,
                :OLD.app_lse_s, :OLD.prcs_c, :OLD.note_type_s);
    END mt_mjl_aiudr;
    /
    
    CREATE OR REPLACE TRIGGER LPR_LP_TEST."MT_MJL_BIUD" 
    BEFORE INSERT OR UPDATE OR DELETE ON mjl
    BEGIN
    mpkg_trig_mjl.mp_mjl_biud;
    END mt_mjl_biud;
    /
    
    CREATE OR REPLACE TRIGGER LPR_LP_TEST."MT_MJL_OBIUR" 
    BEFORE INSERT OR UPDATE ON mjl FOR EACH ROW
    BEGIN
    IF INSERTING THEN
        :NEW.stamp_l := mpkg_util.mp_time_ticker;
    ELSE
        IF :OLD.stamp_l > 999999990 THEN
            :NEW.stamp_l := 1;
        ELSE
            :NEW.stamp_l := :OLD.stamp_l + 1;
        END IF;
    END IF;
    END mt_mjl_obiur;
    /     
    
  • 下面是我正在使用的程序,你在以前的帖子中提供了,它几乎对我很好


  • 现在,逻辑应该是我需要从我创建的文件中传递
    lse\u id
    已保存到过程中
  • 如果我传递的
    lse\u id
    与中的
    应用程序匹配
    然后,我需要更新该行和一些已编码的数据
    我正在正确地执行的字段
  • 如果
    lse_id
    不匹配,那么我必须为此插入一个新行 租约和硬编码字段
  • 我面临的问题是
    mjl
    表中的
    dt\u entu s
    是一个 唯一约束 请让我知道上述内容是否对您有意义

    “我面临的问题是mjl表中的dt是一个独特的约束。”

    实际上它不是,它是复合唯一键的一部分。所以你的ON子句应该匹配ON

    on (tgt.app_lse_s  = src.app_lse_s
        and tgt.dt_ent_s = src.dt_ent_s)
    
    顺便说一句,ON子句中
    trim()
    的使用令人担忧,尤其是
    trim(tgt.app\u lse)
    。如果插入带有尾随空格或前导空格的值,则修剪这些值时,“唯一键”将产生多个点击。从文件加载数据并在表中插入修剪后的值时,应修剪空格


    “ORA-00001:违反唯一约束(LPR_LP_TEST.MJL_IDX0)”

    MJL_IDX0
    必须给我一个唯一的索引。这意味着您需要在考虑唯一记录时包括其列

    显然,直接插入逻辑和合并插入逻辑之间存在差异。你需要比较这两种说法,找出区别

    “我面临的问题是mjl表中的dt是一个独特的约束。”

    实际上它不是,它是复合唯一键的一部分。所以你的ON子句应该匹配ON

    on (tgt.app_lse_s  = src.app_lse_s
        and tgt.dt_ent_s = src.dt_ent_s)
    
    顺便说一句,ON子句中
    trim()
    的使用令人担忧,尤其是
    trim(tgt.app\u lse)
    。如果插入带有尾随空格或前导空格的值,则修剪这些值时,“唯一键”将产生多个点击。从文件加载数据并在表中插入修剪后的值时,应修剪空格


    “ORA-00001:违反唯一约束(LPR_LP_TEST.MJL_IDX0)”

    MJL_IDX0
    必须给我一个唯一的索引。这意味着您需要在考虑唯一记录时包括其列


    显然,直接插入逻辑和合并插入逻辑之间存在差异。您需要比较这两种说法,找出区别所在。

    您能按程序的格式代码编辑问题吗?@Nitish。我试图更改过程的格式代码。位它没有反映…你能按程序的格式代码编辑问题吗?@Nitish。我试图更改过程的格式代码。比特它没有反映…我在这里得到一个错误。插入时抛出ORA-00001:违反了唯一约束(LPR_LP_TEST.MJL_IDX0)。我检查了MJL表,并为此创建了一个索引。我的问题是,当我尝试使用普通的insert语句插入记录时,它工作了,但在merge语句中没有。你能帮我解决这个问题吗?现在我在执行这个过程时发现了以下错误。你能检查一下这个吗。03494开始SP_PTMS_注释(“03494”);完;*第1行错误:ORA-30926:无法在源表ORA-06512:第18行“LPR_LP_TEST.SP_PTMS_NOTES”中获得一组稳定的行。ORA-06512:第1行请阅读我的答案。如果这不能帮助你解决问题,你需要问一个新问题,发布你的合并语句和一小部分复制问题的样本数据。我在这里又遇到了一个错误。插入时抛出ORA-00001:违反了唯一约束(LPR_LP_TEST.MJL_IDX0)。我检查了MJL表,并为此创建了一个索引。我的问题是,当我尝试使用普通的insert语句插入记录时,它工作了,但在merge语句中没有。你能帮我解决这个问题吗?现在我在执行这个过程时发现了以下错误。你能检查一下这个吗。03494开始SP_PTMS_注释(“03494”);完;*第1行错误:ORA-30926:无法在源表ORA-06512:第18行“LPR_LP_TEST.SP_PTMS_NOTES”中获得一组稳定的行。ORA-06512:第1行请阅读我的答案。如果这不能帮助您解决问题,您将需要提出一个新问题,发布合并语句和一小部分复制问题的示例数据。