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.

PLSQL Funktion in Geltungsbereich nicht vorhanden

Empfohlene Antworten

Veröffentlicht

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.

Es wird alles unter dem selben Benutzer durchgeführt?

Ansonsten würde ich testweise vor einfuegen2 den Schemanamen schreiben: benutzer.einfuegen2(...);

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;

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.

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

wieso ich arbeite in der prozedur doch damit weiter. Zitat:

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


  insert into auftrag

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

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

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.