Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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;

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...