• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

PL/SQL: Bind Variablen; warum so komische Nutzung?

Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
Ich verstehe die Funktionsweise von Bind-Variablen in PL/SQL nicht. Mehr als einfache howtos zur Benutzung finde ich auch nicht im Netz. Ich würde aber gerne verstehen, wie sie genau vom PS Executor gehandhabt werden. Z.B. verstehe ich nicht, warum der folgende Code A geht, aber der Code B null in der Bind-Variablen hat.

Code:
-- CODE A:

VARIABLE dept_id NUMBER
DECLARE
  max_deptno own_dep.department_id% TYPE;
  dept_name own_dep.department_name% TYPE := 'Edu';
BEGIN
  SELECT max(department_id) INTO max_deptno FROM own_dep;
  :dept_id := max_deptno+10;
END;
/
BEGIN
  INSERT INTO own_dep (own_dep.department_name, own_dep.department_id, own_dep.location_id)
  VALUES ('peter', :dept_id, null);
END;
Code:
 -- CODE B:

VARIABLE dept_id NUMBER
DECLARE
  max_deptno own_dep.department_id% TYPE;
  dept_name own_dep.department_name% TYPE := 'Edu';
BEGIN
  SELECT max(department_id) INTO max_deptno FROM own_dep;
  :dept_id := max_deptno+10;
  INSERT INTO own_dep (own_dep.department_name, own_dep.department_id, own_dep.location_id)
  VALUES ('peter', :dept_id, null);
END;

(Fehler in B: es kann nicht NULL für own_dep.department_id gesetzt werden)
 

RRA^StArFiRe

Guest
lass dir doch mal bei code a und b nach dem set von :dept_id die variable ausgeben.
und bei code a auch nach dem zweiten begin.
mit DBMS_OUTPUT.PUT_LINE(:dept_id);

oracle ist bei mir schon ein bischen her, aber wird bei code a überhaupt der zweite block ausgeführt?. aber wahrscheinlich schon.

mal bei B nen commit zwischendurch versucht?



aber du willst da nur +10 adden oder?
kannst dafür keinen trigger benutzen?
 
Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
die Aufgabenstellung ist, dafür eine bind-Variable zu nehmen. Deshalb geht es leider nicht mit Trigger.

Die Werte werden automatisch ausgegeben. Im Fall A:
280

280

Das ist der Erwartete Wert, da die letzte ID 270 war.

Im Fall B sind beide Fälle null, es wird nichts ausgegeben.

Übrigens ist Fall A der Fall der geht. Fall B ist der Fall der nicht geht.

Danke für deine Unterstützung ;)
 
Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
niemand außer Starfire hatte schonmal mit oracle DBs zutun?
 

RRA^StArFiRe

Guest
ist das ne übungsaufgabe oder so?

naja, auf jeden fall kann ich mich erinnern, dass es da so regelungen gab, wann dir variablen gesettet werden, quasi wie mit nem commit.
und der doppelpunkt hatte glaube ich so an sich, dass der erst nach abschluss des blocks den wert zugewiesen bekommt.
ich meine, wenn du bei B nur dept_id schreibst, anstatt :dept_id, dann kommt auch das korrekte bei raus.
haste denn schon da rumprobiert mit den aufrufmöglichkeiten?

aber bin mir nicht sicher ;)
ich hab weder die totale ahnung von der theorie hinter der sprache, noch aktuell die methodik im kopf (1 1/2 jahre her).

wird doch bestimmt hier wen geben, der damit sein geld verdient.
 
Oben