ostpower Geschrieben 10. März 2008 Teilen Geschrieben 10. März 2008 Hi bei folgedem script kommt die fehler meldung: The following error has occurred: ORA-06550: line 24, column 4: PLS-00103: Encountered the symbol ";" when expecting one of the following: loop Das Script sieht so aus, was is da falsch? declare a_temp number; cursor c_amount is SELECT to_number(amount) FROM swiss_eu_eu_2006_all; begin open c_amount; loop c_amount.next(); fetch c_amount into a_temp; begin insert into dm_fares_temp(amount) values (:a_temp); exception when others then insert into test(a) values(others); exit when c_amount%NOTFOUND; end loop; close c_amount; end; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 10. März 2008 Teilen Geschrieben 10. März 2008 Hmm da ist mehr als nur ein Fehler drinnen. Zum einen mal die rein programmatischen: c_amount.next(); PL/SQL ist kein Java. Ein Cursor ist keine Klasse und next keine Methode davon. Ein FETCH INTO reicht. insert into dm_fares_temp(amount) values (:a_temp); :variable wird nur bei dynamischem SQL verwendet. In statischem SQL schreibst Du einfach den Variablennamen ohne : rein. when others then insert into test(a) values(others); Ich gehe davon aus, dass Du die Fehlermedlung in eine Tabelle wegloggen willst. Das muss aber so aussehen: INSERT INTO test(a) VALUES(SQLERRM); Bedenke aber, dass falls die Transaktion fehlschlägt (Du oder die DB also einen Rollback ausführt) der Eintrag weg ist. Daher gibt es sog. Autonome Transaktionen die für diesen Zwecke (und auch nur für solche) verwendet werden können. exit when c_amount%NOTFOUND; Hier fehlt vorher noch das Schließen des anonymen BEGIN - END Bocks den Du innerhalb der Schleife aufmachst. So kommen wir jetzt zu dem logischen Fehler den Du gemacht hast. 1. Grundsatz in der Benutzung von PL/SQL: Wenn Du etwas mit SQL machen kannst, dann mach es auch mit SQL und nie mit PL/SQL, denn das ist immer langsamer, verursacht mehr Aufwand und ist fehleranfälliger. Daher lautet das SQL für dein Problem: INSERT INTO dm_fares_temp(amount) SELECT amount FROM swiss_eu_eu_2006_all; Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ostpower Geschrieben 10. März 2008 Autor Teilen Geschrieben 10. März 2008 nee leider net, also ich kann dir ja mal sagen was ich machen will, vielleicht weißt du ja wie ich des machen kann. also die spalte amount in der tabelle swiss... liegt als varchar2 vor (bedingt durch ein import aus nem andern programm). Ich möchte jetzt die daten aus dieser tabelle in eine andere kopieren, dort soll dann allerdings amount als number vorliegen. Jetzt gibt es aber in de Datensätzen amount-daten, in den denen zeichen drin sind (das kann durch dem import gekommen sein, oder sonst wie, aber normal sollten das nur zahlen sein). Ich wollte jetzt durch diese prozedur die amounts, in denen keine zeichen vorkommen, die also in ordnung sind, in die richtige tabelle schreiben, und die amounts, in denen zeichen drin sind, in eine andere tabelle, wo ich diese daten dann bereinigen kann oder sonst was damit mache. Kurz gesagt mit pseudecode würde ich gern so eine abfrage machen: select amount from swiss... where amount != number Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 10. März 2008 Teilen Geschrieben 10. März 2008 Welche Datenbankversion verwendest Du? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ostpower Geschrieben 11. März 2008 Autor Teilen Geschrieben 11. März 2008 Also ich weiß dass es net die neuste Version, welche genau weiß ich gar net. Wo kann man des nachkucken? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 11. März 2008 Teilen Geschrieben 11. März 2008 Am einfachsten so: select * from v$version Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ostpower Geschrieben 11. März 2008 Autor Teilen Geschrieben 11. März 2008 Ok, also hab folgende versionsdaten: Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bi PL/SQL Release 10.2.0.2.0 - Production CORE 10.2.0.2.0 Production TNS for HPUX: Version 10.2.0.2.0 - Production NLSRTL Version 10.2.0.2.0 - Production Und hast du ne idee wie ich dass machen kann mit der typumwandlung bzw. mit der prüfung ob die zeichenkette eine number werden kann. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 11. März 2008 Teilen Geschrieben 11. März 2008 Ok, mit der 10er ist es einfach: Zuerst legst Du dir eine Logtabelle für die Fehler an: BEGIN DBMS_ERRLOG.CREATE_ERROR_LOG('dm_fares_temp', 'errlog'); END; / Und jetzt mit der Option LOG ERRORS deinen Insert: INSERT INTO dm_fares_temp SELECT FROM swiss_eu_eu_2006_all LOG ERRORS INTO errlog ('imp_errors'); In der durch das Package angelegt Fehlertabelle kannst dann nachsehen, was denn so abgelehnt wurde. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.