2016-03-15 28 views
1
CREATE TRIGGER "CPI"."TRGPRODOFFRPRICE" 
AFTER UPDATE or INSERT ON CPI_LOADER_EXEMPTIONS 
FOR EACH ROW 
DECLARE 
table_name varchar(32); 
BEGIN 
if substr(:new.SID_ID,1,3) = 'POP' then 
    table_name := 'PROD_OFFR_PRICE_CHARGE'; 
else 
    table_name := 'PROD_OFFR_PRICE_ALTERATION'; 
end if; 
execute immediate 'UPDATE :1 set CPI_EXEMPTION=:2 WHERE SID_ID=:3' using table_name, :new.FLAG, :new.SID_ID; 
END; 

基於我編輯到這個表單的評論,這看起來更好,但是當試圖插入值到啓動觸發器的表我得到錯誤「無效的表名」,任何想法是什麼造成的這個 ?錯誤的選項卡var聲明可能?oracle,sql,trigger

+1

一如既往地開始簡單...得到一個簡單的觸發器工作正常然後小步驟前進到上面列出的複雜目標...好處是你得到的任何錯誤很容易被識別爲最後一個改變...嘗試上面的錯誤定義可能指向太多的原因 –

+1

這看起來「確定」,但你想要完全動態的sql - 只是將表作爲變量將不會工作 – Hogan

+0

[我應該在標題中使用標籤?](http:// stackoverflow .com/help/tagging):「由於標籤出現在問題的下面,標籤由搜索引擎和您的問題的內容編入索引,您可以相信其他人可以根據他們關注的標籤找到您的問題,或者搜索」。我很難編輯您的問題標題(您真正的機會將您的問題「推銷」給潛在的回答者),因爲它完全是*標籤。請將您的標題編輯爲更多*描述*。 –

回答

0

試試這個(真正的PL/SQL):

CREATE TRIGGER trgSample 
AFTER UPDATE or INSERT ON EXEMPTIONS 
FOR EACH ROW 
DECLARE 
    sid varchar(10); 
    sidVal varchar(100); 
    table_name varchar(32); 
    flag int; 
BEGIN 
    sid := substr(:new.SID_ID,1,3); 
    flag := :new.FLAG; 
    sidVal := :new.SID_ID; 
    if sid = 'POP' then 
    table_name := 'PROD_VAL'; 
    else 
    table_name := 'PROD_VAL2'; 
    end if; 
    execute immediate 'UPDATE ' || table_name 
        || ' set EXEMPTION=sidVal WHERE SID_ID=:x' using sidVal; 
END; 
0

畢竟只有這些變化neccessary: '變無功爲VARCHAR2的表名:' 只有輕微的更新上執行語句: 「執行即時'UPDATE:1 set CPI_EXEMPTION =:2 WHERE SID_ID =:3'using table_name,:new.FLAG,:new.SID_ID;'

感謝所有評論,他們幫助了我很多。並且需要說我學到了很多東西。