SQL Skript "ignore this error"

dior

Bekanntes Mitglied
Hallo,

ich schreibe ein paar ASCII Files in eine Oracle DB. Problem ist, die Spaltennamen unterscheiden sich bei den jeweiligen Files etwas.
D.H. es kann sein das ich mit "Alter Table" ein paar spalten hinzufügen muss (die Namen der Spalten entnehme ich der ASCII Datei)

Problem ist jetzt, ich lese mir die Namen der Spalten mit einem StringBuffer aus und mach mir einen Gesamtstring der in etwa so aussieht:

Java:
Alter Table TESTTABLE2 ADD ("A1" VARCHAR2(20 BYTE)); Alter Table TESTTABLE2 ADD ("A2" VARCHAR2(20 BYTE)); ........

Problem: Die SQL Anweisung bricht evtl. schon beim ersten Alter Table ab da der Wert A1 schon vorhanden ist.
Wie kann ich (wie z.B. in Toad) "ignore this Error" "sagen" damit er jedes Alter Table ausführt, da hier z.B. das A2 nicht vorhanden ist und hinzugefügt werden muss?
 
G

Gast2

Gast
Entweder du setzt anonyme PL/SQL Blocks ab die den Fehler im ALTER statement ignorieren oder aber du machst jedes Statement in einem eigenen DDL Query.

Java:
String[] sqls = "Alter Table TESTTABLE2 ADD ("A1" VARCHAR2(20 BYTE)); Alter Table TESTTABLE2 ADD ("A2" VARCHAR2(20 BYTE)); ........".split(";");

for(String sql : sqls){
  Statement stmt = con.createStatment();
  stmt.execute(sql+";");
}
 

dior

Bekanntes Mitglied
Hi,

Danke für die Antworte. Ich habe probiert das umzusetzten aber es gelingt mir nicht!

Das ist mein String den ich erzeuge: (text = hier lese ich die entsprechenden Werte aus einer txt datei aus)
Java:
AlterTableString = header2AlterTable.append("Alter Table DMT.").append(tableName).append(" ADD (\"").append(text.substring(anfang2+1, ende2)).append("\" " + "VARCHAR2(20 BYTE)" + "); ").toString();
.
.
.

der Aufruf erfolg mit:
Java:
stmt.executeQuery(AlterTableString);

Wenn ich AlterTableString mit println ausgeben und in Toad probiere (test mit WHENEVER SQLERROR CONTINUE;) funktioniert es als "run as Skript" aber nicht mit "excecute statement"

Wie könnte ich das umschreiben das es läuft?
 
G

Gast2

Gast
Probier es mal so:

Java:
        	StringBuilder alterTableString = new StringBuilder();
        	alterTableString.append("BEGIN ");
        	
        	// für alle deine satetments
        	alterTableString.append("BEGIN ");
        	alterTableString.append("Alter Table DMT.");
        	alterTableString.append(tableName);
        	alterTableString.append(" ADD(\"");
        	alterTableString.append(text.substring(anfang2+1, ende2));
        	alterTableString.append("\"VARCHAR2(20 BYTE)); EXCEPTION WHEN others THEN NULL; END;");
        	
        	
        	// am ende 
        	alterTableString.append("END; ");
        	CallableStatement cstmt = conn.prepareCall( alterTableString.toString() );
        	cstmt.execute();
 

dior

Bekanntes Mitglied
Vielen Vielen Dank!!!!

musste nur noch execute immediate ' vor alter Table schreiben! :)

:D
hier nochmal für alle die das Thema auch interessiert mein funktionierender Code:

Java:
public class DbAlterTable_test {
    
    
    public static String header2ohne;
    public static String header2String;
    public static String header2AlterTable;
    public static String AlterTableString;
        
    public static void main(String[] args) throws Exception{
       Connection conn = db_input.DbInsert.getConnection(); 
       
       File file = Variablen.Variablen.file;
        String tableName = Variablen.Variablen.tableName;
        StringBuilder contents = new StringBuilder();
        BufferedReader reader = null;
        
        StringBuilder header2 = new StringBuilder();
        StringBuilder alterTableString = new StringBuilder();

        alterTableString.append("BEGIN ");
        
       try {
            reader = new BufferedReader(new FileReader(file));
            String text = null;

            // repeat until all lines is read
            while ((text = reader.readLine()) != null) {
                contents.append(text)
                    .append(System.getProperty(
                        "line.separator"));
                
              
            int anfang2 = text.indexOf(" ");
            int ende2 = text.indexOf("  "); 
               
            
            // für alle deine statetments
            alterTableString.append("BEGIN ");
            alterTableString.append("execute immediate 'Alter Table DMT.");
            alterTableString.append(tableName);
            alterTableString.append(" ADD(\"");
            alterTableString.append(text.substring(anfang2+1, ende2));
            alterTableString.append("\"VARCHAR2(20 BYTE))'; EXCEPTION WHEN others THEN NULL; END;");
            
                            
            }
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        } finally {
            try {
             // zum Test des Statements   
            System.out.println(alterTableString);
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
            }
        }
       
            // am ende 
            alterTableString.append("END; ");
            CallableStatement cstmt = conn.prepareCall( alterTableString.toString() );
            cstmt.execute();
   
       
    }
    
    
    
    
}







D A N K E
 
G

Gast2

Gast
Vielen Vielen Dank!!!!

musste nur noch execute immediate ' vor alter Table schreiben! :)

Right... Das hatte ich vergessen, aber da bist du ja selber drauf gekommen. :)

Das Beste wäre wenn du noch mit DMBS_SQL deine DDL/DML Statements parsen lässt. So wie es im Moment ist kannst du ein Problem mit SQL Injections haben.

DBMS_SQL
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Inhaltsverzeichnis aufbauen in SQL-Skript Datenbankprogrammierung 0
G H2 SQL Skript generieren Datenbankprogrammierung 2
F Login per JDBC über PHP-Skript? Datenbankprogrammierung 4
Tom#234 Jakarta Web Service SQL Access Error Datenbankprogrammierung 7
Kirby.exe Error bei Trigger Datenbankprogrammierung 5
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
thet1983 MySQL Error Code 1111: Invalid use of group function Datenbankprogrammierung 2
M MySQL Error in SQL syntax Datenbankprogrammierung 10
F Java SQLite Error Datenbankprogrammierung 19
dat_vin JavaFX Datenbankverbindung über JPA und MySQL Error Datenbankprogrammierung 0
G SQLLite error code 0x13: constraint failed Datenbankprogrammierung 7
L Conversion-Error bei JDBC Date Literals Datenbankprogrammierung 3
F Java SQL Syntax Error erst nach mehrmaligen Aufrufen Datenbankprogrammierung 3
H SQLite SQLExeption Domain error Datenbankprogrammierung 2
B Error: ORA-00933: SQL command not properly ended Datenbankprogrammierung 5
D Error 1452: Cannot add or update a child row: a foreign key constraint fails Datenbankprogrammierung 15
Cypha JPA Syntax error - falscher Aufbau? Datenbankprogrammierung 3
B My-SQL Abfrage - Out Of Memory Error Datenbankprogrammierung 13
GianaSisters MySQL Datenbank Select error Datenbankprogrammierung 5
P [Hibernate] SQL Syntax-Error Datenbankprogrammierung 2
D mysql - out of memory error Datenbankprogrammierung 4
X von myISAM auf MEMORY! ERROR 1114: Table full Datenbankprogrammierung 13
N SQL Query Browser Error Datenbankprogrammierung 6
E try Error Datenbankprogrammierung 2
A Socket write error Datenbankprogrammierung 2
L You have an error in your sql syntax Datenbankprogrammierung 4
D Bean: server internal error Datenbankprogrammierung 5
@ HSQLDB: socket creation error Datenbankprogrammierung 6
C Error in my_thread_global_end() - FehlerMeldung MySql? Datenbankprogrammierung 2
foobar ISAM error: too many files open Datenbankprogrammierung 5
E ERROR: argument of JOIN/ON must be type boolean? Datenbankprogrammierung 2
K Connection error Datenbankprogrammierung 18
R Function Sequence Error - Warum? Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben