2013-01-23 16 views
0
create or replace 
PROCEDURE PROMOLOG1 AS 
CURSOR rule IS SELECT * FROM business_rules; --this table had where conditions to use 
TYPE r_cursor IS REF CURSOR; 
ruleMatch r_cursor; 
row_id VARCHAR2(20); 
query_test VARCHAR2(400); 

BEGIN 
    FOR a IN rule LOOP 
    IF a.rule_name != 'Rule1' THEN 
     OPEN rulematch FOR 'SELECT rowid FROM cold_promo_log_dup P WHERE EXISTS(SELECT 1 FROM cold_promo_log_dup C WHERE ' || a.condition || ' AND rowid < P.rowid)'; 
     dbms_output.put_line('matching completed for ' || a.rule_name); 
     LOOP 
     FETCH ruleMatch INTO row_id; 
     EXIT WHEN rulematch%notfound; 
     query_test := 'INSERT INTO cold_promo_log_duplicate SELECT * FROM cold_promo_log_dup WHERE rowid = ''' || row_id ||'''' ; 
     dbms_output.put_line(query_test); 
     --EXECUTE IMMEDIATE 'INSERT INTO cold_promo_log_duplicate SELECT * FROM cold_promo_log_dup WHERE rowid = ''' || row_id || ''''; 
     INSERT INTO cold_promo_log_duplicate SELECT * FROM cold_promo_log_dup WHERE rowid = row_id ; 
     EXECUTE IMMEDIATE 'DELETE FROM cold_promo_log_dup WHERE rowid = ' || row_id; 
     END LOOP; 
    END IF; 
    END LOOP; 
END PROMOLOG1; 

執行上述程序中的Oracle投擲以下錯誤:ROWID是autometically改變PL/SQL塊

Connecting to the database dedupe_preprod. 
    ORA-00904: "AAALJBABVAANSZDAAA": invalid identifier 
    ORA-06512: at "DEDUPE.PROMOLOG1", line 23 
    ORA-06512: at line 2 
    matching completed for Rule2 
    INSERT INTO cold_promo_log_duplicate SELECT * FROM cold_promo_log_dup WHERE rowid = 'AAALJBABvAANsZDAAA' 
    Process exited. 
    Disconnecting from the database dedupe_preprod. 

當我打印它具有很少的小寫字母(AAALJBABvAANsZDAAA)其rowid,但錯誤顯示所有大寫字母(AAALJBABVAANSZDAAA)。數據庫中沒有大寫的rowid,因此出現錯誤無效標識符。
任何幫助表示讚賞。

+0

使用chartorowid –

回答

3

首先你的row_id變量應該是ROWID類型而不是varchar2。

其次是這樣的錯誤:

EXECUTE IMMEDIATE 'DELETE FROM cold_promo_log_dup WHERE rowid = ' || row_id; 

你沒有引號,(所以其治療的ROWID作爲一個標識符)。但爲什麼你在動態SQL中運行這個?

如果你要離開這個動態,你應該使用一個綁定變量,因此不會垃圾你的共享池並提高性能。

+0

感謝它的工作現在。我用綁定變量修改了我的查詢。感謝您的建議。 – subash

0

不要對rowid進行循環。你這樣做:你可以刪除該行,並將其插入其他地方。最好的辦法是使用DELETE ... RETURNING BULK COLLECT ...,這樣你就不需要使用rowid了,你可以使用set而不是使用for循環,這將逐行執行。