2017-03-02 170 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;