Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

PL/SQL Scriptfehler

Empfohlene Antworten

Veröffentlicht

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;

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

  • Autor

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

  • Autor

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.

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.