Zum Inhalt springen

PL/SQL Scriptfehler


ostpower

Empfohlene Beiträge

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;

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...