2017-03-02 164 views
0

如果我執行下面的查詢,那麼我得到無效字符。查詢是無效字符(ORA-00911:無效字符)問題

declare 
sql_query varchar2(4000):='delete from '; 
begin 
for i in (
select table_name,column_name from User_tab_cols where column_name like '%PROFILE_ID' and table_name not like 'GSC%' and table_name not like '%BKP%' order by 1) 
loop 
sql_query :=sql_query ||i.table_name; 
sql_query:=sql_query || ' where '||i.column_name ||' = ' ||32052721 ||';'; 
execute immediate sql_query; 
commit; 
end loop; 
end; 

請幫我解決這個問題。

非常感謝您的幫助。

我正在使用Oracle 11.2.0.4.0版本。

+0

可能您在循環選擇中接收到多行?如果是這樣,您需要每次追加'刪除'。 – Mikhail

+1

從'sql_query'字符串的末尾刪除分號。這是直接的問題。但是你也需要在每個循環中重新開始整個命令,就像Mikhail所表明的那樣。 –

+0

非常感謝您的回覆。我已經嘗試過米哈伊爾選項,但仍然遇到像無效字符一樣的問題。非常感謝您的幫助。 – Sunitha

回答

1

我想,你需要爲循環的每次迭代啓動sql_query。例如,像這樣:

declare 
sql_query varchar2(4000); 
begin 
for i in (
select table_name,column_name from User_tab_cols where column_name like '%PROFILE_ID' and table_name not like 'GSC%' and table_name not like '%BKP%' order by 1) 
loop 
sql_query :='delete from '; 
sql_query :=sql_query ||i.table_name; 
sql_query:=sql_query || ' where '||i.column_name ||' = 32052721'; 
execute immediate sql_query; 
commit; 
end loop; 
end; 
+0

謝謝你的答覆。但我仍然得到像ORA-00911一樣的錯誤:無效字符 ORA-06512:在第10行。請幫助我。很多謝謝。 – Sunitha

+0

@Sunitha你在什麼環境下試圖執行此操作? sqlplus,SQL開發人員或其他東西?嘗試在腳本末尾添加/,如果這是sqlplus。 – Mikhail

+0

@Sunitha剛剛測試過它 - 工作沒有錯誤。你在sql_query的末尾刪除了分號嗎? – Mikhail

1

試試這個:有一個額外的「;」在動態的字符串。

這裏:

sql_query:= sql_query || 'where'|| i.column_name ||' ='|| 32052721 ||';';

DECLARE 
    sql_query VARCHAR2 (4000) := 'delete from '; 
BEGIN 
    FOR i 
     IN ( SELECT table_name, column_name 
       FROM User_tab_cols 
      WHERE  column_name LIKE '%PROFILE_ID' 
        AND table_name NOT LIKE 'GSC%' 
        AND table_name NOT LIKE '%BKP%' 
      ORDER BY 1) 
    LOOP 
     sql_query := sql_query || i.table_name; 
     sql_query := 
     sql_query || ' where ' || i.column_name || ' = ' || 32052721 ; 

     EXECUTE IMMEDIATE sql_query; 
     Sql_query:=' '; 
     COMMIT; 
    END LOOP; 
END; 
0

您需要重新初始化在每次循環查詢,並省略後面的分號。

DECLARE 
    l_sql_query VARCHAR2 (2000); 
BEGIN 
    FOR i IN ( SELECT table_name, column_name 
        FROM user_tab_cols 
       WHERE column_name LIKE '%PROFILE_ID' 
        AND table_name NOT LIKE 'GSC%' 
        AND table_name NOT LIKE '%BKP%' 
       ORDER BY 1) 
    LOOP 
     l_sql_query := ' delete from ' || i.table_name || ' where ' || i.column_name || ' = ' || 32052721; 

     EXECUTE IMMEDIATE l_sql_query; 

     COMMIT; 
    END LOOP; 
END;