# ORACLE SELECT Substitutionsvariable



## sophie19890 (18. September 2008)

Hallo!

Wenn ich folgende Befehle ausführe:

```
DEFINE employee_num=200

SELECT employee_id, last_name, salary, department_id 
FROM employees
WHERE employee_id = &employee_num;

UNDEFINE employee_num
```
bekomme ich folgende Fehlermeldung:

ORA-00900: Ungültige SQL-Anweisung

Woran kann das liegen?
Höchstwahrscheinlich ist es eh so einfach zu lösen, dass ich mich jetzt sogar schäme, es überhaupt zu posten. :-(
lg Sophie


----------



## Denfie (18. September 2008)

Hiho,

weiss nicht ob dir das besser hilft aber hast du es schon mal mit folgendem Statement probiert?


```
DECLARE
 employee_num NUMBER(9) := 200;
BEGIN
 SELECT employee_id, last_name, salary, department_id 
 FROM employees
 WHERE employee_id = employee_num;
END;
/
```
lg Dennis


----------



## sophie19890 (18. September 2008)

Danke für deine Antwort!

Es geht mir hauptsächlich um die Substitutionsvariable. Ohne dem define und undefine kommt eine andere Fehlermeldung. Nämlich, dass die Substitutionsvariable keinen Wert enthält. Komisch war nur, dass ich davor bei anderen ORACLE-Datenbanken-Homepage  Substitutionsvariablen einfach anwenden konnte und bei der jetztigen eben nicht. 

Der oben angeführte Select ist dem in einem ORACLE-Skriptum gleich. Deswegen versteh ich noch weniger, warum das nicht funktioniert.

lg Sophie

PS: Ich kenn mich mit PLSQL nicht so gut aus. Dein Vorschlag lieferte eine Fehlermeldung: ORA-06550: Zeile 5, Spalte 2: PLS-00428: In dieser SELECT-Anweisung wird eine INTO-Klausel erwartet

Bei PLSQL verändert man ja Datensätze die man zuvor selektiert hat, wenn ich mich nicht irre. Kann es sein, dass er auf einen INSERT wartet?


----------



## Denfie (18. September 2008)

> Bei PLSQL verändert man ja Datensätze die man zuvor selektiert hat, wenn ich mich nicht irre. Kann es sein, dass er auf einen INSERT wartet?


Er wartet nicht richtig auf ein INSERT er möchte einfach nur, das man die Variable die man vorher bei DECLARE gesetzt hat nun z.B. so setzt


```
DECLARE  
 employee_num NUMBER(9) := 200; 
 employee_id NUMBER(9) := 0;
BEGIN  
SELECT employee_id INTO employee_id, 
       last_name, salary, department_id   
FROM employees  
WHERE employee_id = employee_num; 
END; 
/
```
Meine Oracle Datenbank hat sich gerade verabschiedet kann deswegen nicht bei mir testen.

Welche Oracle version benutzt du kann sein das die Versionsunterschiede hier noch eine Rolle spielen.


----------



## sophie19890 (19. September 2008)

Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production

Ich habe über einen meiner ehemaligen Professor erfahren, dass die Version auch in diesen Bereichen eingeschränkt ist. Die Substitutionsvariablen können daher nicht verwendet werden.

Der Code funktioniert bei mir nicht. Folgende Fehlermeldungen:
ORA-06550: Zeile 6, Spalte 8:
PLS-00201: Bezeichner 'LAST_NAME' muss deklariert werden
ORA-06550: Zeile 6, Spalte 44:
PL/SQL: ORA-00904: : ungültiger Bezeichner
ORA-06550: Zeile 5, Spalte 1:
PL/SQL: SQL Statement ignored

lg Sophie


----------



## Denfie (21. September 2008)

Hmmm kann sein das Oracle das nicht mag wenn ein Spaltenname wie eine Variable heißt. Probier mal das und dann musst du dir auch ganz sicher sein, dass die anderen Spalten auch so geschrieben werden.

```
DECLARE  
 e_num NUMBER(9) := 200; 
 e_id NUMBER(9) := 0;
BEGIN  
SELECT employee_id INTO e_id, last_name, salary, department_id   
FROM employees  
WHERE employee_id = e_num; 
END; 
/
```
lg Dennis


----------



## sophie19890 (22. September 2008)

Folgende Fehlermeldungen beim Ausführen:

ORA-06550: Zeile 5, Spalte 31:
PLS-00201: Bezeichner 'LAST_NAME' muss deklariert werden
ORA-06550: Zeile 5, Spalte 67:
PL/SQL: ORA-00904: : ungültiger Bezeichner
ORA-06550: Zeile 5, Spalte 1:
PL/SQL: SQL Statement ignored​
Vielleicht schränkt ORACLE auch das ein  Ich kenn mich leider bei PLSQL nicht aus. 
Danke 

lg Sophie


----------



## Biber2 (22. September 2008)

Moin Sophie19890,

IMHO muss bei einem SELECT INTO für jedes Feld im Resultset eine typ-lich dazu passende Variable zugeordnet werden.
Also reduziere Deinen Resultset entweder auf das eine Feld, das Du ja offensichtlich rausfieseln willst (recommended).

```
DECLARE  
 e_num NUMBER(9) := 200; 
 e_id NUMBER(9) := 0;
BEGIN  
SELECT employee_id INTO e_id  
FROM employees  
WHERE employee_id = e_num; 
END; 
/
```
-oder, Plan B, definiere (z.B. in der Debug/Testphase) eben die anderen Variablen auch-

```
DECLARE  
 e_num NUMBER(9) := 200; 
 e_id NUMBER(9) := 0;
 vcLastname Varchar(50); // Variable für Feld last_name
 dSellerie Double;      // Variable für Feld Salary
 nDepp_id = Number; // Variable für Department_id
BEGIN  
SELECT employee_id,
            last_name, salary, department_id   
INTO e_id, vcLastname, dSellerie, nDepp_id
FROM employees  
WHERE employee_id = e_num; 
END; 
/
```

Grüße
Biber


----------

