【问题标题】:PL/SQL when no data found exceptionPL/SQL 找不到数据时的异常
【发布时间】:2018-06-25 18:05:16
【问题描述】:

我有一个问题,我正在尝试解决一个触发器,该触发器必须检查一个对象是否保存在一个表中。但是如果我选择具有我想要插入的相同 cod 对象的元素和这个对象表中不存在触发器让我找到未找到数据的异常。如果触发器让我找不到数据,我该如何插入?

我可以这样做吗?

EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO VALUES TABLE_X (:NEW.A,:NEW.B,:NEW.C)

【问题讨论】:

  • 请发布您迄今为止尝试过的任何代码,以及一些输入数据以及触发器的预期操作
  • @shrek 我只想知道如何避免找不到数据异常。现在我无法发布代码,因为我是从智能手机打字
  • 尝试进行 count() 检查,如果 count() > 0,则对象/值存在,如果 count(*) = 0,则不存在。
  • 您可以探索的另一个选项是使用 MERGE 语句。

标签: sql plsql oracle11g


【解决方案1】:

是的,你可以做到。

考虑以下几点:

SQL> CREATE TABLE TABLE_X(A INT, B INT, C INT);

Table created
SQL> CREATE TABLE TABLE_Y(A INT, B INT, C INT);

Table created

SQL> CREATE OR REPLACE TRIGGER trg_bi_ins_y
  2  BEFORE INSERT ON TABLE_Y
  3  FOR EACH ROW
  4  DECLARE
  5    V_A TABLE_Y.A%TYPE;
  6  BEGIN
  7   BEGIN
  8       SELECT Y.A
  9         INTO V_A
 10         FROM TABLE_Y Y
 11        WHERE Y.A = :NEW.A;
 12     EXCEPTION
 13      WHEN NO_DATA_FOUND THEN
 14         INSERT INTO TABLE_X VALUES(:NEW.A,:NEW.B,:NEW.C);
 15   END;
 16  END;
 17  /

Trigger created

SQL> INSERT INTO TABLE_Y VALUES(1,0,0); 

1 row inserted

SQL> SELECT * FROM TABLE_Y;

 A   B   C
--- --- ---
 1   0   0

SQL> SELECT * FROM TABLE_X;

 A   B   C
--- --- ---
 1   0   0

-- the row with value 1 for column A does not exist, and insertion to TABLE_X occurs.

SQL> INSERT INTO TABLE_Y VALUES(1,1,1);

1 row inserted


SQL> SELECT * FROM TABLE_Y;

 A   B   C
--- --- ---
 1   0   0
 1   1   1

SQL> SELECT * FROM TABLE_X; 

 A   B   C
--- --- ---
 1   0   0

-- the row with value 1 for column A already exists, and no insertion occurs.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 2018-07-16
    • 2012-11-30
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多