【问题标题】:Trigger is invalid and failed re-validation error while inserting records插入记录时触发器无效且重新验证失败错误
【发布时间】:2015-12-22 13:25:22
【问题描述】:

我有这样的表,带有触发器和序列:

  CREATE TABLE "RTH"."TBL_USER" 
   (    "USR_ID" VARCHAR2(1 BYTE) NOT NULL ENABLE, 
    "USR_IS_ANONYMOUS" RAW(1), 
    "USR_FIRST_NAME" CLOB, 
    "USR_MID_NAME" CLOB, 
    "USR_LST_NAME" CLOB, 
    "USR_PRIMARY_EMAIL" CLOB, 
    "USR_ALT_EMAIL" CLOB, 
    "USR_PRIMARY_CNCT_NMBR" CLOB, 
    "USR_SECONDARY_CNCT_NMBR" CLOB, 
    "USR_TYPE" CLOB, 
    "USR_CATEGORY" CLOB, 
    "USR_DOB" TIMESTAMP (0), 
    "USR_CREATE_DT" TIMESTAMP (0), 
    "CUPN_ID" VARCHAR2(1 BYTE), 
    "USR_MARITIAL_STUTUS" VARCHAR2(20 BYTE), 
    "USR_GENDER" VARCHAR2(1 BYTE), 
    "USR_IMAGE" RAW(1), 
    "USR_PASSWORD" VARCHAR2(20 BYTE), 
     CONSTRAINT "XPKTBL_USER" PRIMARY KEY ("USR_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "USERS" 
 LOB ("USR_FIRST_NAME") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) 
 LOB ("USR_MID_NAME") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) 
 LOB ("USR_LST_NAME") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) 
 LOB ("USR_PRIMARY_EMAIL") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) 
 LOB ("USR_ALT_EMAIL") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) 
 LOB ("USR_PRIMARY_CNCT_NMBR") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) 
 LOB ("USR_SECONDARY_CNCT_NMBR") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) 
 LOB ("USR_TYPE") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) 
 LOB ("USR_CATEGORY") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING ) ;


  CREATE OR REPLACE TRIGGER "RTH"."TBL_USER_TRIGGER" 
BEFORE INSERT ON TBL_USER
FOR EACH ROW
BEGIN
SELECT TBL_USER_SEQ.nextval
INTO :new.USR_ID
FROM dual;
END;

ALTER TRIGGER "RTH"."TBL_USER_TRIGGER" ENABLE
/
ALTER TRIGGER "RTH"."TBL_USER_TRIGGER" ENABLE;

当我尝试插入一条记录时,我收到一条错误消息:

java.sql.SQLSyntaxErrorException: ORA-04098: trigger 'RTH.TBL_USER_TRIGGER' is invalid and failed re-validation

插入记录的Java代码:

String query = "insert into TBL_USER(USR_FIRST_NAME,USR_LST_NAME,USR_PRIMARY_EMAIL,USR_PASSWORD) values(?,?,?,?)";
PreparedStatement pst = con.prepareStatement(query);

pst.setString(1, user.getFirstName());
pst.setString(2, user.getLastName());
pst.setString(3, user.getEmail());
pst.setString(4, user.getPassword());
pst.executeUpdate();

我尝试在线查找但找不到解决我的错误的方法,大多数错误与 oracle 本身有关

更新:按照@Durga Viswanath 的建议,运行查询:

select * from all_sequences where sequence_name = 'TBL_USER_SEQ';

给出以下结果:

SEQUENCE_OWNER                 SEQUENCE_NAME                  MIN_VALUE              MAX_VALUE              INCREMENT_BY           CYCLE_FLAG ORDER_FLAG CACHE_SIZE             LAST_NUMBER            
------------------------------ ------------------------------ ---------------------- ---------------------- ---------------------- ---------- ---------- ---------------------- ---------------------- 
RTH                            TBL_USER_SEQ                   1                      9999999999999999999999999999 1                      N          N          100                    101                    

1 rows selected

现在插入记录时出现新错误:

One error saving changes to table "RTH"."TBL_USER":
Row 10: ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "RTH.TBL_USER_TRIGGER", line 2
ORA-04088: error during execution of trigger 'RTH.TBL_USER_TRIGGER'
ORA-06512: at line 1

【问题讨论】:

  • 您能否也发布TBL_USER_SEQ 的表定义?尝试在触发器定义后使用SHOW ERRORS
  • @TimBiegeleisen 更新了问题
  • 你需要经历错误并理解它们的含义,错误清楚地表明“字符串缓冲区太小”。我已经编辑了这个问题的答案。

标签: java oracle


【解决方案1】:

像这样运行以获得触发器的问题。按异常触发无效。

SQL> alter trigger tbl_user_trigger compile;

Warning: Trigger altered with compilation errors.

SQL> show errors
Errors for TRIGGER TBL_USER_TRIGGER:

<It will display errors here>

此外,您可以运行此查询来确认您是否有序列。从语法上讲,您的触发代码是正确的。

select * from all_sequences where sequence_name = 'TBL_USER_SEQ';

回复ORA-06502: PL/SQL: numeric or value error: character string buffer too small

您有"USR_ID" VARCHAR2(1 BYTE) NOT NULL ENABLE,,这意味着 USR_ID 只能存储一个字符。一旦 usr_id 超过 9,它将抛出错误。您需要更改 USR_ID 的数据类型。

【讨论】:

  • 使用您的 cmets 更新了问题。我现在收到一个新错误,请查看
  • 我已将 ID 列类型更改为 NUMBER。现在它的工作,但我在这里有一个问题。 id 从 101 开始插入。将它作为 ID 列的 BLOB 或 INTEGER 类型更好吗?你有什么建议吗?我对 oracle 不是很了解
  • 它应该是整数,因为该字段不会有小数。如果有助于解决问题,也可以标记为已回答并投赞成票。
  • ID 没有按顺序插入?
  • 这是一个单独的问题,您需要进一步阅读有关序列的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多