Zum Inhalt springen

PLSQL Funktion in Geltungsbereich nicht vorhanden


myrabbitrules

Empfohlene Beiträge

Hi!

Ich bin noch sql Anfänger.

Ich erzeuge in einem oracle sql skript zunächst eine Funktion einfuegen2:

create or replace

function einfuegen2

(  

 ...

)

return kunde.knr%type

is

  ...  

  return newknr ;

end;

/
in dem selben skript erzeuge ich eine Prozedur auftrag_eintragen2:
create or replace

procedure auftrag_eintragen2

(

  ...

)

is

  newknr kunde.knr%type;

begin


  newknr := einfuegen2(vorname, name, geschlecht, land);


  insert into auftrag

  values (newknr, datum, betrag, 0, mahntermin);

end;

/
Dann führe ich das Skript aus. Die Funktion einfuegen2 wird auch kompiliert und in meinem sql developer angezeigt. Nur meckert der Kompiler in der Prozedur auftrag_eintragen2. Er meint, dass
 newknr := einfuegen2(vorname, name, geschlecht, land);

nicht geht, weil in diesem Geltungsbereich keine Funktion mit dem Namen einfuegen2 vorhanden sei.

Das verstehe ich nicht. Muss ich die Funktion noch lokal in der Prozedur bekannt machen?

(Wie gesagt, alles steht im selben Skript und ich arbeite mit dem oracle sql developer)

Ich wäre euch sehr dankbar.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also bei mir kommt der Fehler nicht...

Ich bin zwar mit dem Toad und nicht mit dem sql developer unterwegs, aber das sollte keinen Unterschied machen...

Hier den Code den ich genommen hatte:

CREATE OR REPLACE FUNCTION TESTT (inti number) RETURN NUMBER

IS

BEGIN

RETURN 1;

END TESTT;

/

show errors;

CREATE OR REPLACE PROCEDURE TEST1 (inti number)

IS

int_id number;

BEGIN

int_id := TESTT(1);

END TEST1;

/

show errors;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm komisch, das von Stefan geht bei mir auch... Ich hab echt keine Idee..

Könnte vielleicht jemand einfach mal folgendes copy-pasten:

set feedback 7

set echo on

set serveroutput on


drop table kunde cascade constraints;

drop table auftrag cascade constraints;

drop table eintreiber cascade constraints;


create table kunde(

  knr number(5),

  vorname varchar(10),

  name varchar(10) not null,

  geschlecht varchar(1),

  land varchar(3),

  primary key(knr),

  constraint kunde1 check(geschlecht in ('M','W'))

);


create table auftrag(

  knr number(5),

  datum date,

  betrag number(7,2) not null,

  mahnungsanzahl number(1) default 0,

  mahntermin date not null,

  primary key(knr,datum),

  constraint auftrag1 check(mahnungsanzahl<4),

  constraint auftrag2 foreign key(knr) references kunde(knr)

);


create table eintreiber(

  knr number(5),

  rechnungsdatum date,

  uebergabetermin date,

  primary key(knr,rechnungsdatum)

);


create or replace

procedure einfuegen

(

  kundennummer in kunde.knr%type,

  vorname in kunde.vorname%type,

  name in kunde.name%type,

  geschlecht in kunde.geschlecht%type,

  land in kunde.land%type

)

is

begin

  insert into kunde

  values(kundennummer, vorname, name, geschlecht, land);

end;

/


execute einfuegen(23, 'Hans', 'Meier', 'M', 'Ger');


select * from kunde;


create or replace

function einfuegen2

(  

  vorname in kunde.vorname%type,

  name in kunde.name%type,

  geschlecht in kunde.geschlecht%type,

  land in kunde.land%type

)

return kunde.knr%type

is

  newknr kunde.knr%type;

begin

  select max(kunde.knr)

  into newknr

  from kunde;


  if (newknr is null) then

    newknr := 0;

  else

    newknr := newknr + 1;

  end if;


  insert into kunde

  values(newknr, vorname, name, geschlecht, land);


  return newknr ;

end;

/


execute einfuegen2('Peter', 'Maffai', 'M', 'Ger');

execute einfuegen2('Richard', 'Schubert', 'M', 'Ger');


select * from kunde;


create or replace

procedure auftrag_eintragen

(

  kundennummer auftrag.knr%type,

  betrag auftrag.betrag%type,

  datum auftrag.datum%type

)

is

  mahntermin auftrag.datum%type;

begin

  mahntermin := datum + 7;


  insert into auftrag

  values (kundennummer, datum, betrag, 0, mahntermin);

end;

/


execute auftrag_eintragen(23, 23.34, sysdate);


select * from auftrag;


create or replace

procedure auftrag_eintragen2

(

  vorname in kunde.vorname%type,  

  name in kunde.name%type,

  geschlecht in kunde.geschlecht%type,

  land in kunde.land%type,

  betrag auftrag.betrag%type,

  datum auftrag.datum%type

)

is

  newknr kunde.knr%type;

begin


  newknr := einfuegen2(vorname, name, geschlecht, land);


  insert into auftrag

  values (newknr, datum, betrag, 0, mahntermin);

end;

/


execute auftrag_eintragen2('Carmen', 'Electra', 'W', 'USA', 2348.34, sysdate);


select * from auftrag;

in der letzten Funktion kommt es bei mir zum Compiler-Fehler.

Link zu diesem Kommentar
Auf anderen Seiten teilen

so klappt es leider auch nicht. Jetzt sagt er mir: ungültige Bindevariable foo. Ich hab mal gegoogelt und irgendjemand sagte, dass schlüsselwort variable dürfte man nur bei sql*plus und nicht bei plsql benutzen. Ich habs weggelassen, aber die Fehlermeldung "ungültige Bindevariable" bleibt. Ich habs auch mit meiner "newknr" probiert - das selbe Problem...

Das ist doch bestimmt irgendwas total Triviales ;) Bitte helft mir auf die Sprünge..

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Rückgabewert der Funktion muss auch irgendwohin.


variable foo number;

execute :foo := function('param1', 'param2');

Also eine Function in PL/SQL wird nicht so aufgerufen. Richtig wäre :


foo:= function('param1', 'param2');

- Foo muss (sollte) mit demselben Typ wie der Rückgabewert der Funktion definiert werden

Noch ein Tip : Gewöhne dich daran, in PL/SQL ausschliesslich in Packages zu arbeiten, nicht mit Funktionen / Prozeduren.

Gruss

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