2016-07-15 13 views
0

Ich versuche, eine Eingabevariable in pl/SQL zuzuweisen.Wie weisen Sie einer Spalte in plsql eine anonyme Variable zu?

Ich möchte die Datenbank abfragen, indem ich den Benutzer department_id eingibt und den Vornamen, den Nachnamen und das Gehalt ausgibt. Das Gehalt ist das zweithöchste Gehalt in der Tabelle.

declare 
v_dept_id int; 

Begin 
Select emp1.first_name, emp1.last_name, emp1.salary, emp1.department_id 
From employees emp1 
Where (1) = 
(select count(distinct(emp1.salary)) 
    From employees emp2 
     Where emp2.salary > emp1.salary) ; 
End; 

Klärung EDIT: bearbeiteten ich den Code V_dept_id enthalten aber es erklären
v_dept_id int laufen doesnt;

Begin 
Select emp1.first_name, emp1.last_name, emp1.salary, emp1.department_id 
into v_dept_id 
From employees emp1 
Where ((1) = 
(select count(distinct(emp1.salary)) 
    From employees emp2 
     Where emp2.salary > emp1.salary)) and v_dept_id = '&Enter_dept_id' ; 
End; 

Fehler:

Error starting at line : 4 in command - 
declare 
v_dept_id int; 

Begin 
Select emp1.first_name, emp1.last_name, emp1.salary, emp1.department_id 
into v_dept_id 
From employees emp1 
Where ((1) = 
(select count(distinct(emp1.salary)) 
    From employees emp2 
     Where emp2.salary > emp1.salary)) and v_dept_id = '&Enter_dept_id' ; 
End; 
Error report - 
ORA-06550: line 6, column 16: 
PL/SQL: ORA-00947: not enough values 
ORA-06550: line 5, column 1: 
PL/SQL: SQL Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

EDIT2 basierend auf Antwort unten Feedback mit dem Fehler Ich weiß nicht, wie die eine Zahl in der Aufforderung korrekt eingeben lassen

declare 
v_dept_id number; 
v_fname varchar(50); 
v_lname varchar(50); 
v_salary NUMBER(8,2); 

Begin 
Select emp1.department_id, emp1.first_name, emp1.last_name, emp1.salary 
into v_dept_id, v_fname, v_lname, v_salary 
From employees emp1 
Where ((1) = 
(select count(distinct(emp1.salary)) 
    From employees emp2 
     Where emp2.salary > emp1.salary)) and v_dept_id = '&Enter_dept_id' ; 
End; 


Error starting at line : 1 in command - 
declare 
v_dept_id number; 
v_fname varchar(50); 
v_lname varchar(50); 
v_salary NUMBER(8,2); 

Begin 
Select emp1.department_id, emp1.first_name, emp1.last_name, emp1.salary 
into v_dept_id, v_fname, v_lname, v_salary 
From employees emp1 
Where ((1) = 
(select count(distinct(emp1.salary)) 
    From employees emp2 
     Where emp2.salary > emp1.salary)) and v_dept_id = '&Enter_dept_id' ; 
End; 
Error report - 
ORA-01403: no data found 
ORA-06512: at line 8 
01403. 00000 - "no data found" 
*Cause: No data was found from the objects. 
*Action: There was no data from the objects which may be due to end of fetch. 
+0

Wo verwenden Sie v_dept_id? Frage ist nicht klar. in Plsql, wenn Sie Select-Anweisung verwenden, müssen Sie INTO-Klausel verwenden, um Werte in einige Variable zuzuweisen. –

+0

gerade hinzugefügt es! aber es funktioniert nicht – Venom

+0

Ich möchte einen PLSQL-Block erstellen, der als Eingabe eine Abteilungsnummer verwendet und den Vor- und Nachnamen des Mitarbeiters und das Gehalt des Mitarbeiters ausgibt, der das zweithöchste Gehalt innerhalb dieser Abteilung hat. – Venom

Antwort

1

Raj_Te warum Ihr Code kompiliert wird nicht erklärt hat. Aber ich mag Ihre Methode nicht, das zweithöchste Gehalt zu bekommen. Ich schätze, Ihre Methode funktioniert, aber es ist nicht klar, was dieser Codeabschnitt erreichen soll.

Im folgenden Code gibt die DENSE_RANK-Funktion die Gehaltsrangfolge jeder Zeile zurück. Alle Zeilen, die das gleiche Gehalt haben den gleichen Rang erhalten:

SELECT 
emp.first_name 
,emp.last_name 
,emp.salary 
,emp.department_id 
FROM 
(SELECT 
    emp1.first_name 
    ,emp1.last_name 
    ,emp1.salary 
    ,emp1.department_id 
    ,DENSE_RANK() OVER (PARTITION BY emp1.department_id ORDER BY emp1.salary DESC) dr 
    FROM 
    employees  emp1 
    WHERE emp1.department_id = &dept_id 
) emp 
WHERE 1=1 
AND emp.dr = 2 
; 

Durch die Angabe emp.dr = 2 wir sagen, wir alle Zeilen wollen, wo das Gehalt auf Rang zweithöchste.

+0

danke es hat funktioniert, aber ich muss das emp1 in der ersten Select-Anweisung entfernen, so in der ersten Select-Anweisung wäre es SELECT vorname, last_name, Gehalt, department_id – Venom

+0

Ja, in der Tat, meine Entschuldigung. Der Alias ​​sollte emp - Ich werde meine Antwort aktualisieren –

0

Sie wählen 4 Felder in einer einzelnen Variablen aus. Deshalb gibt es nicht genug Werte. Sie müssen entweder 4 Variablen entkalken oder Datensätze mit 4 Spalten erstellen und dann die Werte erfassen.

Select emp1.first_name, emp1.last_name, emp1.salary, emp1.department_id 
into v_dept_id <--- trying to fetch 4 columns values to a single varibale. 

Sie können als Ihre Auswahl neue Variablen gleichen Datentypen decalre und es tun:

Select emp1.first_name, emp1.last_name, emp1.salary, emp1.department_id 
into v_emp_first_nm,v_emp_last_nm ,v_emp_sal,v_dept_id 
+0

in Ordnung. Wie wäre es mit einer Eingabe, sagen wir, der Benutzer möchte 90 in die Eingabeaufforderung eingeben, die beim Ausführen der Abfrage angezeigt wird? Ich habe das noch nicht richtig herausgefunden. Auch ich änderte es oben mit dem Fehler wieder – Venom

+0

Dies sollte Ihr Problem lösen === http://stackoverflow.com/questions/15558929/how-do-you-pass-an-argument-to-a-pl-sql -block-in-a-sql-Datei-genannt-using-sta Suchen Sie auch nach dem folgenden Link ==== http://plsql-tutorial.com/plsql-passing-parameters-procedure-function.htm – XING

+0

PL/SQL ist nicht interaktiv. Eingabeaufforderung ist der Job einer Client-Anwendung wie SQL \ * Plus, Perl oder Java.Wenn dies immer von SQL \ * Plus ausgeführt wird, sehen Sie [ACCEPT] (http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve005.htm). –

Verwandte Themen