2017-10-10 68 views
0

我使用Oracle 12.2C,我需要執行觸發器:執行該觸發器後我的觸發器有什麼問題?

審覈表

CREATE TABLE "MY_USER"."AUDIT" 
(
    "TABLE_NAME" VARCHAR2(20 CHAR)  NOT NULL ENABLE, 
    "REGISTER_ID" NUMBER(19, 0) DEFAULT 0 NOT NULL ENABLE, 
    "OPERATION" VARCHAR2(20 CHAR)  NOT NULL ENABLE, 
    "DATETIME" TIMESTAMP(6)   NOT NULL ENABLE, 
    "PO_DOCUMENT" CLOB, 
    CONSTRAINT "ENSURE_JSON" CHECK (po_document IS JSON) ENABLE 
); 

觸發

CREATE OR REPLACE EDITIONABLE TRIGGER "MY_USER"."TRG_PARTNER" 
AFTER DELETE OR INSERT OR UPDATE ON "MY_USER"."PARTNER" 
FOR EACH ROW 
DECLARE 
    vOperation VARCHAR2(6); 
    vTableName VARCHAR2(30) := 'PARTNER'; 
    vLOGON_TYPE CHAR(1); 
    vLAST_UPDATE DATE; 
    vSTATUS CHAR(1); 
    vADMIN_PASSWORD VARCHAR2(255 CHAR); 
    vPASSWORD VARCHAR2(255 CHAR); 
    vSESSION_VALID_SECONDS NUMBER(10, 0); 
    vONBOARDING CHAR(1); 
    vID VARCHAR2(255 CHAR); 
    vNAME VARCHAR2(255 CHAR); 
    vNETWORK_CODE VARCHAR2(255 CHAR); 

BEGIN 

    IF INSERTING THEN 
    vOperation := 'INSERT'; 
    vLOGON_TYPE := :NEW.LOGON_TYPE; 
    vLAST_UPDATE := :NEW.LAST_UPDATE; 
    vSTATUS := :NEW.STATUS; 
    vADMIN_PASSWORD := :NEW.ADMIN_PASSWORD; 
    vPASSWORD := :NEW.PASSWORD; 
    vSESSION_VALID_SECONDS := :NEW.SESSION_VALID_SECONDS; 
    vONBOARDING := :NEW.ONBOARDING; 
    vID := :NEW.ID; 
    vNAME := :NEW.NAME; 
    vNETWORK_CODE := :NEW.NETWORK_CODE; 

    ELSIF UPDATING THEN 
    vOperation := 'UPDATE'; 
    vLOGON_TYPE := :NEW.LOGON_TYPE; 
    vLAST_UPDATE := :NEW.LAST_UPDATE; 
    vSTATUS := :NEW.STATUS; 
    vADMIN_PASSWORD := :NEW.ADMIN_PASSWORD; 
    vPASSWORD := :NEW.PASSWORD; 
    vSESSION_VALID_SECONDS := :NEW.SESSION_VALID_SECONDS; 
    vONBOARDING := :NEW.ONBOARDING; 
    vID := :NEW.ID; 
    vNAME := :NEW.NAME; 
    vNETWORK_CODE := :NEW.NETWORK_CODE; 

    ELSIF DELETING THEN 
    vOperation := 'DELETE'; 
    vLOGON_TYPE := :OLD.LOGON_TYPE; 
    vLAST_UPDATE := :OLD.LAST_UPDATE; 
    vSTATUS := :OLD.STATUS; 
    vADMIN_PASSWORD := :OLD.ADMIN_PASSWORD; 
    vPASSWORD := :OLD.PASSWORD; 
    vSESSION_VALID_SECONDS := :OLD.SESSION_VALID_SECONDS; 
    vONBOARDING := :OLD.ONBOARDING; 
    vID := :OLD.ID; 
    vNAME := :OLD.NAME; 
    vNETWORK_CODE := :OLD.NETWORK_CODE; 

    END IF; 

    INSERT INTO "MY_USER"."AUDIT" (TABLE_NAME, REGISTER_ID, OPERATION, DATETIME, PO_DOCUMENT) 
    VALUES (
    vTableName, 
    vID, 
    vOperation, 
    sysdate, 
    json_object('logon_type' VALUE vLOGON_TYPE, 'last_update' VALUE vLAST_UPDATE, 'status' VALUE vSTATUS, 'admin_password' VALUE vADMIN_PASSWORD, 'password' VALUE vPASSWORD, 'session_valid_seconds' VALUE vSESSION_VALID_SECONDS, 'onboarding' VALUE vONBOARDING, 'id' VALUE vID, 'name' VALUE vNAME, 'network_code' VALUE vNETWORK_CODE) 
); 

END; 

,並嘗試插入的東西,我得到一個錯誤。但是如果我放棄這個觸發器並執行相同的操作insert沒有問題。

[2017年10月10日10時38分08秒] [42000] [1722] ORA-01722:無效號碼

[2017年10月10日10時38分08秒] ORA-06512:在 「MY_USER.TRG_PARTNER」 58行

[2017年10月10日10時38分08秒] ORA-04088:觸發器 'MY_USER.TRG_PARTNER'

什麼是執行過程中的錯誤是錯誤的觸發?這是我的插入:

INSERT INTO PARTNER 
(ID, ADMIN_PASSWORD, LAST_UPDATE, LOGON_TYPE, NAME, ONBOARDING, PASSWORD, SESSION_VALID_SECONDS, STATUS, NETWORK_CODE) 
VALUES ('example foo', 'foo', TO_DATE('2003/05/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'), 'T', 'foo', 'o', 'foo', 4344, 'A', 'foo'); 

和線路58 vNETWORK_CODE VARCHAR2(255 CHAR);這不是一個數字

合作伙伴

CREATE TABLE PARTNER (
    ID     VARCHAR2(255 CHAR) PRIMARY KEY, 
    ADMIN_PASSWORD  VARCHAR2(255 CHAR) NOT NULL, 
    LAST_UPDATE   DATE    NOT NULL, 
    LOGON_TYPE   CHAR(1)   NOT NULL, 
    NAME     VARCHAR2(255 CHAR) NOT NULL, 
    ONBOARDING   CHAR(1)   NOT NULL, 
    PASSWORD    VARCHAR2(255 CHAR) NOT NULL, 
    SESSION_VALID_SECONDS NUMBER(10, 0)  NOT NULL, 
    STATUS    CHAR(1)   NOT NULL, 
    NETWORK_CODE   VARCHAR2(255 CHAR), 
    CONSTRAINT UK_PARTNER_NAME UNIQUE (NAME) 
); 
+0

好吧,58線在哪裏?錯誤是非常具體的。無論你有什麼價值,它都不是一個有效的數字。 – OldProgrammer

+0

不是Oracle專家,但該「第58行」表示問題出現在最後一個插入位置。我會寫一些東西來找到你爲特定語句獲得的價值。 – HLGEM

+0

什麼是合作伙伴的ddl – Moudiz

回答

0

從評論事實證明,AUDIT.REGISTER_ID有一些數據類型,而vID有一個字符類型。

因此,INSERT將因您提到的錯誤而失敗。

一個解決方案是將REGISTER_ID列的數據類型更改爲VARCHAR2(255),以便它可以處理字符串。