У меня есть 2 одинаковые таблицы, просто измените имя table1 и table2, когда 3 записи вводятся в table1, информация из этой таблицы должна быть скопирована в таблицу 2, а таблица 1 снова должна быть пустой.
CREATE TABLE TABLA1(
ID_1 NUMBER PRIMARY KEY, NOMBRE VARCHAR2(40));
CREATE TABLE TABLA2(
ID_1 NUMBER PRIMARY KEY, NOMBRE VARCHAR2(40));
SELECT * FROM TABLA1;
SELECT * FROM TABLA2;
SET SERVEROUTPUT ON;
CREATE OR REPLACE TRIGGER DISP_BACKUP
BEFORE INSERT ON TABLA1
FOR EACH ROW
DECLARE
CURSOR CUR_CUENTA IS SELECT * FROM TABLA1;
--CURSOR CUR_CUENTA IS SELECT COUNT(*) FROM TABLA1;
var_rows := SQL%ROWCOUNT;
--CURCHOISE SQL%ROWCOUNT;
BEGIN
dbms_output.put_line('NUMERO DE REGISTROS EN TABLA 1' || CUR_CUENTA%ROWCOUNT
);
--OPEN CUR_CUENTA;
IF CUR_CUENTA%ROWCOUNT > 3 THEN
IF INSERTING THEN
INSERT INTO TABLA2 (ID_1,NOMBRE) VALUES (:NEW.ID_1,:NEW.NOMBRE);
END IF;
DELETE FROM TABLA1;
END IF;
END;
/
код не работает, логика внутри триггера не работает. Я пытаюсь использовать% rowcount для подсчета 3 записей, но не могу заставить его работать.
Вы не сделали выборку из курсора, поэтому его количество строк будет равно нулю. Но он все равно не будет делать то, что вы хотите, и если вы запросите таблицу, с которой работает триггер, вы получите ошибку мутирующей таблицы. Вы также подсчитываете только существующие строки, а не тот, который запускает триигр; и вы копируете только этот (а не все) в другую таблицу. Это кажется действительно странным, и вы не должны делать этого в триггере - хотя, возможно, вы могли бы попробовать с триггером после утверждения.
Если каким образом это резервная копия? Записи в TABLA2 не являются резервной копией TABLA1, потому что вы продолжаете удалять эти записи из TABLA1. Единый набор записей не является резервной копией.


Вам нужно будет использовать триггер оператора вместо триггера строки - в противном случае вы не сможете получить доступ к таблице, в которой определен триггер. Вы также, вероятно, захотите использовать AFTER INSERT вместо триггера BEFORE INSERT:
CREATE OR REPLACE TRIGGER DISP_BACKUP
AFTER INSERT ON TABLA1
DECLARE
TYPE typRowIDCollection IS TABLE OF ROWID;
colROWIDs typRowIDCollection;
BEGIN
SELECT ROWID
BULK COLLECT INTO colROWIDs
FROM TABLA1;
dbms_output.put_line('NUMERO DE REGISTROS EN TABLA 1' || colROWIDs.COUNT);
IF colROWIDs.COUNT >= 3 THEN
FORALL i IN colROWIDs.FIRST..colROWIDs.LAST
INSERT INTO TABLA2 (ID_1, NOMBRE)
SELECT ID_1, NOMBRE
FROM TABLA1
WHERE ROWID = colROWIDs(i);
FORALL i IN colROWIDs.FIRST..colROWIDs.LAST
DELETE FROM TABLA1 WHERE ROWID = colROWIDS(i);
END IF;
END DISP_BACKUP;
Это должно сделать это.
Похоже, вы забыли задать свой вопрос.