【问题标题】:Reading CLOB in before insert,update trigger在插入之前读取 CLOB,更新触发器
【发布时间】:2017-02-21 13:40:15
【问题描述】:

我正在尝试在 Oracle 中的表上创建一个插入和更新前触发器。 在尝试阅读 NEW.CLOB_COLUMN_VALUE 时,它给了我空白。

表:

CREATE TABLE TEMP_TEST101
(
  ID               NUMBER(2),
  TEST_CLOB_VALUE  CLOB
)

触发器:

CREATE OR REPLACE TRIGGER TR_Temp_Test101
BEFORE INSERT OR UPDATE
ON Temp_Test101 FOR EACH ROW
DECLARE
BEGIN

If (:NEW.TEST_CLOB_VALUE = 'A')
Then
    raise_application_error(-20010,'Testing Successfull');
End IF;

raise_application_error(-20010,'Testing Failed:['||:NEW.TEST_CLOB_VALUE||']');


END TR_Temp_Test101;
/

尝试插入后提示:

ORA-20010: Testing Failed:[]

有什么方法可以在插入/更新之前读取:NEW.TEST_CLOB_VALUE

要求是在插入/更新之前验证CLOB列的数据。

【问题讨论】:

  • 这似乎工作正常。 - 插入 A 得到“成功 [A]”,插入 B 得到 [失败 [B]”。您还没有显示您使用的插入语句 - 您尝试插入的实际值是什么?
  • 我总是使用 rowid 添加记录。插入查询工作得很好。 : 从 Temp_Test101 t1 中选择 rowid,t1.*
  • 感谢您的快速回复和更正。使用 rowid 添加时,提示显示空 []。然而,当使用插入语句时,触发器工作正常。
  • 不确定您的意思...您是通过选择现有值来插入的?该查询会为您的表提供太多列...此外,您使用的是哪个版本的 Oracle,以防万一?
  • @AlexPoole。很明显,他试图将一个 clob 与一个字符进行比较。可能存在 clob 有一些空格并且没有得到评估的情况。

标签: oracle triggers clob


【解决方案1】:

由于它是clob 列,因此您需要将条件检查为

dbms_lob.substr(:NEW.TEST_CLOB_VALUE,1,1) = 'A'

查看演示:

CREATE OR REPLACE TRIGGER TR_Temp_Test101
   BEFORE INSERT OR UPDATE
   ON Temp_Test101
   FOR EACH ROW
DECLARE
BEGIN
   IF (dbms_lob.substr(:NEW.TEST_CLOB_VALUE,1,1) = 'A')
   THEN
      raise_application_error (-20010, 'Testing Successfull');
   END IF;

   raise_application_error (
      -20010,
      'Testing Failed:[' || :NEW.TEST_CLOB_VALUE || ']');
END TR_Temp_Test101;

执行:

SQL> Insert into TEMP_TEST101 values(1,'A');
Insert into TEMP_TEST101 values(1,'A')
            *
ERROR at line 1:
ORA-20010: Testing Successfull
ORA-06512: at "TR_TEMP_TEST101", line 5
ORA-04088: error during execution of trigger 'TR_TEMP_TEST101'

【讨论】:

  • OP 似乎想要比较整个值,而不仅仅是第一个字符?将 CLOB 与 CLOB 进行比较,就像将 CLOB 与字符串文字进行比较一样,直到达到 32k 字符串文字限制。
  • 我检查了他的示例代码。看起来他不想比较整个 clob,这也是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
相关资源
最近更新 更多