【问题标题】:Query is giving invalid character (ORA-00911: invalid character)issue查询给出无效字符(ORA-00911:无效字符)问题
【发布时间】:2017-07-22 00:22:23
【问题描述】:

如果我执行下面的查询,那么我得到 无效字符。

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 版本。

【问题讨论】:

  • 您是否会在 for 循环选择中收到多行?如果是这样,您需要每次都附加 'delete from '。
  • 删除sql_query 字符串末尾的分号。这就是眼前的问题。但是您还需要在每个循环中重新启动整个命令,正如 Mikhail 所示。
  • 非常感谢您的回复。我已经尝试了 Mikhail 选项,但仍然遇到像 Invalid character 这样的问题。非常感谢您的帮助。

标签: sql plsql oracle11g oracle10g


【解决方案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;

【讨论】:

  • 感谢您的回复。但我仍然收到类似 ORA-00911: invalid character ORA-06512: at line 10 的错误。请帮助我。非常感谢。
  • @Sunitha 您要在什么环境中执行此操作? sqlplus, sql developer 还是别的什么?如果是 sqlplus,请尝试在脚本末尾添加 / 行。
  • @Sunitha 刚刚测试过 - 可以正常工作。您是否删除了 sql_query 末尾的分号?
【解决方案2】:

试试这个:动态字符串中有一个额外的“;”。

这里:

sql_query:=sql_query || ' 其中 '||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;

【讨论】:

    【解决方案3】:

    您需要在每个循环中重新初始化查询,并省略结尾的分号。

    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;
    

    【讨论】:

      猜你喜欢
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多