PL/SQL Fehler: 01722 Invalid Number

Hallo,

ich bin ganz neu im PL/SQL Umfeld und weiss mir leider so langsam nicht mehr zu helfen. Ich habe schon bei Google gesucht, aber die gefundenen Lösungsvorschläge brachten bei mir nicht den erhofften Erfolg. Folgende PL/SQL Prozedur bekomme ich einfach nicht zum Laufen:

CREATE OR REPLACE PROCEDURE Up_Datei(new_datname varchar2, p_datno number)
IS
BEGIN
Update datei
SET datname = ‚new_datname‘
where datno = ‚p_datno‘;
commit;
END Up_Datei;
/

DECLARE
p_no number := ‚99‘;
n_name varchar2(10) := ‚TEST‘;
BEGIN
Up_Datei(n_name, p_no);
END;
/

Ich habe anstatt der Zeile p_no number auch schon versucht p_no integer zu nehmen, das ging aber auch nicht, der Fehler war der gleiche.

Ich hoffe ihr könnt mir helfen, ich weiss nicht was ich noch versuchen soll :frowning:
Danke schonmal an Euch

Hallo Marco,

where datno = ‚p_datno‘;

ist falsch, weil’p_datno’ ein String ist.
Gruß, muzel

Hallo Marco,

where datno = ‚p_datno‘;

ist falsch, weil’p_datno’ ein String ist.
Gruß, muzel

Hallo muzel,

aber warum ist es ein String? ich will die ‚99‘ an die Prozedur übergeben. die Variable p_no ist vom Typ NUMBER. Und meine Prozedur fängt sie doch auch mit p_datno NUMBER auf?
Ich versteh noch nicht ganz was ich falsch mache óÓ

Grüße

Hallo Marco,

weil beim fraglichen Aufruf das Statement

Update datei SET datname = 'Test' where datno = '99';

lautet, aber eigentlich

Update datei SET datname = 'Test' where datno = 99;

lauten müsste. Auch der Aufruf müsst eigentlich

DECLARE
 p\_no number := 99;
 n\_name varchar2(10) := 'TEST';
 BEGIN
 Up\_Datei(n\_name, p\_no);
 END;
/

lauten.

MfG Georg V.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

ich hab den Aufruf wie von dir geschrieben verändert. Jetzt kommt der nächste Fehler :frowning: Jetzt ist auf einmal meine Prozedur ungültig. Ich hab schon alles Mögliche ausprobiert, aber ich kriegs nicht hin. Wahrscheinlich liegt der Fehler wieder direkt vor meiner Nase und ich komm einfach nicht drauf :frowning:

Hier mal noch ein Screenshot von dem Fehler:
http://img182.imageshack.us/img182/4873/screen001xe7…

Ich probier noch ein bisschen weiter, würde mich aber trotzdem über Unterstützung freuen.

Hi!

Der Screenshot sagt eh schon alles aus …

Also:
a) Die Prozedur ist fehlerfrei kompilierbar?
b) Wieso rufst Du die Prozedur als SYSTEM-User auf?
c) Hat der aufrufende User auch alle Berechtigungen?
d) Gibt es Synonyme auf diese Prozedur?
e) Was sagt ein „select * from dba_objects where object_name=‚UP_DATEI‘;“?

Grüße,
Tomh

Hallo Marco,

gerade frisch in die Datenbank eingetippt:

Verbunden mit: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

SQL\> create table datei (datname varchar2(200), datno integer);
Tabelle wurde erstellt.

SQL\> insert into datei values ('alterName.txt',99);
1 Zeile wurde erstellt.

SQL\> commit;
Transaktion mit COMMIT abgeschlossen.

SQL\> CREATE OR REPLACE PROCEDURE Up\_Datei(new\_datname varchar2, p\_datno number)
 2 IS
 3 BEGIN
 4 UPDATE datei
 5 SET datname = new\_datname
 6 WHERE datno = p\_datno;
 7 COMMIT;
 8 END Up\_Datei;
 9 /
Prozedur wurde erstellt.

SQL\> DECLARE
 2 p\_no number := 99;
 3 n\_name varchar2(10) := 'TEST';
 4 BEGIN
 5 Up\_Datei(n\_name, p\_no);
 6 END;
 7 /
PL/SQL-Prozedur erfolgreich abgeschlossen.

SQL\> select \* from datei;

DATNAME DATNO
--------------- ----------
TEST 99

Sollte also funktionieren! Bitte drop die Procedure und setze das Ganze nochmal auf, wenn Deine Statements identisch aussehen.

MfG Georg V.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

@Georg
Ich habs auch nochmal in SQL Plus probiert, dort funktioniert es :smiley:
Danke schonmal dafür :smiley:

Jetzt muss ich es nur noch im SQL Developer hinkriegen óÓ

@Tomh
zu a) Die Prozedur ist fehlerfrei kompilierbar?
Ja die Prozedur lässt sich im SQL Developer ohne Probleme kompilieren.

zu b) Wieso rufst Du die Prozedur als SYSTEM-User auf?
Naja ich habe die Datenbank bei mir installiert und es wurde während der Installation nur nach einem Passwort für den User SYSTEM gefragt. Ich konnte keine weiteren anlegen. Der Beispieluser scott mit PW tiger funktioniert auch nicht. Ich bin ja aber wie gesagt noch blutiger Anfänger im Thema Datenbanken. Sollte ich nicht den SYSTEM User nehmen?

zu c) Hat der aufrufende User auch alle Berechtigungen?
Der aufrufende User ist doch bei mir im Moment SYSTEM ? Ich denke der sollte doch alle Berechtigungen haben?

zu d) Gibt es Synonyme auf diese Prozedur?
Also ich habe nichts erstellt, das der Prozedur Up_Datei auch nur entfernt ähnlich sieht óÓ

zu e) Was sagt ein „select * from dba_objects where object_name=‚UP_DATEI‘;“?
Das sagt gar nichts. Es zeigt ein paar Spalten an, die sind aber ohne Inhalt. Ich habe die Prozedur aber gerade extra nochmal neu angelegt. Da muss doch irgendwas rauskommen eigentlich?

Danke schonmal wieder für alle Mühen.

So ich habs jetzt endlich auch im SQL Developer hingebkommen :smiley:

Das Statement wie Georg es verbessert hatte funktionierte ja schon in SQL Plus. Es lag wohl an den Hochkommata, deswegen dachte die Datenbank, dass es sich um einen String handelt, der ja logischerweise nicht vom Datentyü NUMBER ist.

In SQL Plus hab ich dann auf der linken Seite endlich mal gesehen, dass man sich da die erstellten Prozeduren auch ansehen kann ^^ Da dann auf die Prozedur rechtsgeklickt, comile for debug und einen letzten kleinen Syntaxfehler gefunden.

Funktioniert jetzt alles wunderbar, danke Leute für die tolle Hilfe :smiley: