我試圖插入一條記錄到另一個表(表B)一旦特定條件插入之後滿足到某個表(表A) 所以我有創建了一個觸發器,檢查上述條件: 條件:插入tablea後,檢查tablea中的價格總和是否大於某個值,如果是,則將tino插入到tableb中。觸發問題:ORA-00905:缺少關鍵字
下面的腳本將重新創建我目前面臨的問題..需要另外支付的眼睛在這個。
-- create the tables
CREATE TABLE tablea
(
tino NUMBER not null,
price VARCHAR2(200),
dated date
)
partition by range (DATED)
(
partition PART_201608 values less than (TO_DATE(' 2016-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition PART_201609 values less than (TO_DATE(' 2016-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition PART_201610 values less than (TO_DATE(' 2016-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
)
--INSERT VALUES
INSERT INTO tablea (tino,price,dated)VALUES('1234567',10,SYSDATE);
COMMIT;
INSERT INTO tablea (tino,price,dated)VALUES('1234560',20,SYSDATE);
COMMIT;
-- create table table which once condition is met,, data is written into
CREATE TABLE tableb(tino number);
-- CREATE THE TRIGGER
CREATE OR REPLACE TRIGGER trg1
AFTER INSERT
ON tablea
FOR EACH ROW
DECLARE
v_price NUMBER;
v_partition VARCHAR2(20) := 'PART_'||TO_CHAR(SYSDATE,'YYYYMM');
v_tino VARCHAR2(20) := :NEW.tino;
sql_smt VARCHAR2(1000) := '';
BEGIN
sql_smt :='
SELECT SUM(price) price INTO v_price
FROM tablea PARTITION('||v_partition||')
WHERE tino = '||''''||v_tino||''''||'';
BEGIN
EXECUTE IMMEDIATE sql_smt;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE('QUERY='|| sql_smt);
END;
--DBMS_OUTPUT.PUT_LINE('PRICE =' || v_price);
IF v_price >= 15 THEN
INSERT INTO tableb (tino) VALUES (v_tino);
COMMIT;
END IF;
END;
-- test the trigger
INSERT INTO tablea(tino,price,dated) VALUES('1234567',10,sysdate);
COMMIT;
應該返回一個ORA-00905:缺少關鍵字
DBMS_OUTPUT.PUT_LINE(SQLERRM);
返回:
SELECT SUM(price) price INTO v_price
FROM tablea PARTITION(PART_201609)
WHERE tino = '1234567'
這應該沒有問題
任何指針跑了?
你可能不能。 A上的觸發器通常不會查詢A而不會得到突變的觸發器錯誤(這聽起來像您正在對下面的答案進行評論)。除非您碰巧有手動分區表,否則不應該明確指定分區名稱。只需使用謂詞並讓Oracle找出分區即可。這消除了動態SQL的需要。如果你想要一個聲明式的解決方案,一個帶約束的快速刷新的物化視圖比使用觸發器更好,再加上它可以在多用戶系統中工作。 –