2017-03-02 3 views
0

Wenn ich unten Abfrage ausführen, dann bekomme ich ungültiges Zeichen.Abfrage gibt ungültiges Zeichen (ORA-00911: ungültiges Zeichen) Problem

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; 

Bitte helfen Sie mir zu diesem Thema.

Vielen Dank für Ihre Hilfe.

Ich verwende Oracle 11.2.0.4.0 Version.

+0

Möglicherweise erhalten Sie mehrere Zeilen in for-Schleife auswählen? Wenn ja, müssen Sie jedes Mal "Löschen von" anhängen. – Mikhail

+1

Entfernen Sie das Semikolon vom Ende Ihrer 'sql_query' Zeichenfolge. Das ist das unmittelbare Problem. Aber Sie müssen auch den ganzen Befehl in jeder Schleife neu starten, wie Mikhail gezeigt hat. –

+0

Vielen Dank für Ihre Antwort. Ich habe Mikhail Option versucht, aber immer noch das gleiche Problem wie ungültige Zeichen. Vielen Dank für deine Hilfe. – Sunitha

Antwort

1

Ich denke, Sie müssen sql_query für jede Iteration der Schleife initiieren. Zum Beispiel wie folgt aus:

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

Vielen Dank für Ihre Antwort.Aber noch bekomme ich den gleichen Fehler wie ORA-00911: ungültiges Zeichen ORA-06512: an der Linie 10. Bitte helfen Sie mir. Vielen Dank. – Sunitha

+0

@Sunitha In welcher Umgebung versuchen Sie dies auszuführen? sqlplus, SQL-Entwickler oder etwas anderes? Versuchen Sie, die Zeile mit/am Ende des Skripts hinzuzufügen, wenn dies sqlplus ist. – Mikhail

+0

@Sunitha Ich habe es einfach getestet - funktioniert ohne Fehler. Hast du das Semikolon am Ende von sql_query entfernt? – Mikhail

1

Versuchen Sie folgendes: Es gibt ein zusätzliches ‚;‘ in Ihrer dynamischen String.

hier:

sql_query: = sql_query || 'wo' || i.Spaltenname || ' = '|| 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

Sie benötigen eine Abfrage auf jeder Schleife neu zu initialisieren, und das hintere Semikolon weglassen.

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; 
Verwandte Themen