このコードのどこに問題があるかわからないので、助けが必要です。パッケージ、トリガー、およびプロシージャは正常に動作しません
私は2つのテーブルを持っています。商品(id、..、currentPrice)と価格(id、product_id、日付、価格)。 Prices.priceの値が挿入、更新、または削除されたときにProducts.currentPriceの値を自動的に更新するトリガーとプロシージャを作成する必要があります。 私はパッケージ、2つのトリガとプロシージャを作成し、それらはすべてコンパイルOKですが、挿入、更新、または値を削除すると何も起こりません。 しかし、手作業を呼び出して、product_id(たとえば、Productsテーブルの既存の製品の値1)をProducts.currentPriceのid 1の製品の値が毎回更新されます。 私は 'データが見つかりません'というエラーが出るので、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;
自発的なトランザクションを使用してはいけません。また、ここでトリガーを変更するべきでもありません。トリガを変更することがグローバルな操作であり、現在のセッションだけでなく、すべてのセッションに影響するという事実は含まれていません。 –