이 코드의 문제점이 어디 있는지 알 수 없기 때문에 도움이 필요한 사람이 필요합니다.패키지, 트리거 및 프로 시저가 정상적으로 작동하지 않습니다.
2 개의 테이블이 있습니다. 제품 (id, .., currentPrice) 및 가격 (id, product_id, 날짜, 가격). Prices.price의 값이 삽입, 업데이트 또는 삭제 될 때 Products.currentPrice의 값을 자동으로 업데이트하는 트리거 및 프로 시저를 만들어야합니다. 패키지, 두 개의 트리거 및 프로 시저를 만들고 모두 컴파일 할 수 있지만 확인, 삽입 또는 업데이트 또는 값을 삭제할 때 아무 일도 발생하지 않습니다. 그러나 수동으로 프로 시저를 호출하고 product_id (예 : 제품 테이블의 기존 제품에 대한 값 1)를 삽입 할 때마다 id 1 인 제품의 Products.currentPrice 값이 업데이트됩니다. BEFORE 트리거의 값이 PACKAGE 변수에 저장되지 않는다고 생각합니다. '데이터를 찾을 수 없음'오류가 발생했기 때문입니다. SQL Developer와 Oracle 11g XE를 사용하고 있습니다. 당신은 관련된 여기에 몇 가지를하고있는
CREATE OR REPLACE PACKAGE mypackage IS
gid NUMBER;
END;
CREATE OR REPLACE TRIGGER trg_currentprice1
BEFORE INSERT OR UPDATE OR DELETE ON prices
FOR EACH ROW
BEGIN
IF (INSERTING OR UPDATING) THEN
BEGIN
mypackage.gid := :new.product_id;
END;
ELSE
BEGIN
mypackage.gid := :old.product_id;
END;
END IF;
END;
CREATE OR REPLACE TRIGGER trg_currentprice2
AFTER INSERT OR UPDATE OR DELETE ON prices
DECLARE
v_id NUMBER := mypackage.gid;
BEGIN
calc_currentprice(v_id);
END;
CREATE OR REPLACE PROCEDURE calc_currentprice(prodid IN NUMBER) AS
curprice Products.currentPrice%TYPE;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
curprice := 0;
SELECT price INTO curprice FROM prices
WHERE product_id = prodid AND date = (SELECT MAX(date) FROM prices WHERE product_id = prodid AND date <= SYSDATE);
EXECUTE IMMEDIATE 'ALTER TRIGGER trg_products_forbid2 DISABLE';
UPDATE products
SET currentPrice = curprice
WHERE product_id = prodid;
EXECUTE IMMEDIATE 'ALTER TRIGGER trg_products_forbid2 ENABLE';
END;
해제와 동의 - 자율 거래를 사용해서는 안되며 여기에서 트리거를 변경해야합니다. 트리거를 변경하는 것이 글로벌 작업이며 현재 세션뿐 아니라 모든 세션에 영향을 미친다는 사실을 포함하지 않는 이유 중 하나입니다. –