2017-08-26 1 views
0

Dies sind die Liste der Tabellen I erstellt und eingefügt Werte für die erstellten Tabellen:ORACLE PL/SQL-Funktion wird nicht erfolgreich erstellt, aber die Ausführung Körper funktioniert nicht

CREATE TABLE DEPARTMENT 
(DEPARTMENT_ID NUMBER PRIMARY KEY, 
DEPARTMENT_NAME VARCHAR(30) NOT NULL 
); 

CREATE TABLE JOBS 
(JOB_ID NUMBER PRIMARY KEY, 
    JOB_TITLE VARCHAR(35) NOT NULL, 
    MIN_SALARY DECIMAL NOT NULL, 
    MAX_SALARY DECIMAL NOT NULL 
); 

CREATE TABLE EMPLOYEES 
(EMPLOYEE_ID NUMBER PRIMARY KEY, 
FIRST_NAME VARCHAR(20) NOT NULL, 
LAST_NAME VARCHAR(25) NOT NULL, 
EMAIL VARCHAR(25) NOT NULL, 
PHONE_NUMBER VARCHAR(20) NOT NULL, 
HIRE_DATE DATE NOT NULL, 
JOB_ID NUMBER NOT NULL, 
SALARY DECIMAL NOT NULL, 
DEPARTMENT_ID NUMBER NOT NULL, 
CONSTRAINT emp_job_fk FOREIGN KEY(JOB_ID) REFERENCES JOBS(JOB_ID), 
CONSTRAINT emp_department_fk FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(DEPARTMENT_ID) 
); 

INSERT INTO DEPARTMENT (DEPARTMENT_ID,DEPARTMENT_NAME) 
VALUES(1,'IT'); 
INSERT INTO DEPARTMENT (DEPARTMENT_ID,DEPARTMENT_NAME) 
VALUES(2,'Sales'); 

INSERT INTO JOBS (JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY) 
VALUES (1,'IT Administrator',250000.00,50000.00); 
INSERT INTO JOBS (JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY) 
VALUES (2,'Salesman',200000.00,40000.00); 

INSERT INTO EMPLOYEES (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,DEPARTMENT_ID) 
VALUES (1,'Tony','Starc','[email protected]','',TO_DATE('15/1/2008','DD/MM/YYYY'),1,45000.00,1); 
INSERT INTO EMPLOYEES (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,DEPARTMENT_ID) 
VALUES (2,'Bruce','Wayne','[email protected]','',TO_DATE('15/1/2009','DD/MM/YYYY'),1,40000.00,1); 
INSERT INTO EMPLOYEES (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,DEPARTMENT_ID) 
VALUES (3,'Larry','Ellison','[email protected]','',TO_DATE('15/1/2010','DD/MM/YYYY'),1,30000.00,1); 
INSERT INTO EMPLOYEES (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,DEPARTMENT_ID) 
VALUES (4,'Steve','Jobs','[email protected]','',TO_DATE('15/1/2011','DD/MM/YYYY'),2,35000.00,2); 
INSERT INTO EMPLOYEES (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,DEPARTMENT_ID) 
VALUES (5,'Remy','Lebeau','[email protected]','',TO_DATE('15/1/2012','DD/MM/YYYY'),2,30000.00,2); 
INSERT INTO EMPLOYEES (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,DEPARTMENT_ID) 
VALUES (6,'Clark','Kent','[email protected]','',TO_DATE('15/1/2013','DD/MM/YYYY'),2,35000.00,2); 

Jetzt in meiner Aufgabe Frage, ich habe wurde gebeten, die folgende Frage zu lösen: Schreiben Sie eine Funktion namens fn_emps_per_dept_jc450912, um EMPLOYEE_ID, FIRST_NAME, LAST_NAME und JOB_TITLE mit einer gegebenen DEPARTMENT_ID abzurufen. Diese Funktion sollte DEPARTMENT_ID als Eingabeparameter haben und diese Funktion sollte EMPLOYEE_ID, FIRST_NAME, LAST_NAME UND JOB_TITLE als Ausgabeparameter haben. Es sollte TRUE zurückgeben, wenn es gefunden wird, und FALSE, wenn es nicht gefunden wird.

Um die Information der Mitarbeiter von einer bestimmten Abteilung angezeigt werden, ich habe die folgende Funktion geschrieben:

CREATE OR REPLACE FUNCTION fn_emps_per_dept_jc450912 (f_dept_id IN NUMBER,f_emp_id OUT NUMBER,f_first_name OUT VARCHAR,f_last_name OUT VARCHAR,f_job_title OUT VARCHAR) 
RETURN BOOLEAN 
AS 
BEGIN 
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,JOB_TITLE 
INTO f_emp_id,f_first_name,f_last_name,f_job_title 
FROM EMPLOYEES,JOBS,DEPARTMENT 
WHERE DEPARTMENT.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID 
AND JOBS.JOB_ID = EMPLOYEES.JOB_ID 
AND EMPLOYEES.DEPARTMENT_ID = f_dept_id; 
RETURN TRUE; 
EXCEPTION 
WHEN NO_DATA_FOUND 
THEN 
DBMS_OUTPUT.PUT_LINE('Employee not found'); 
RETURN FALSE; 
END fn_emps_per_dept_jc450912; 

Function FN_EMPS_PER_DEPT_JC450912 compiled 

Wie Sie aus der oben sehen können, dass die Funktion erfolgreich kompiliert wurde.

Dann habe ich versucht, die Funktion ausführt:

DECLARE 
f_dept_id NUMBER; 
f_emp_id NUMBER; 
f_first_name VARCHAR(30) ; 
f_last_name VARCHAR(30) ; 
f_job_title VARCHAR(30); 
f_return BOOLEAN; 
BEGIN 
f_dept_id := 1; 
f_return := fn_emps_per_dept_jc450912(f_dept_id,f_emp_id,f_first_name,f_last_name,f_job_title); 
DBMS_OUTPUT.PUT_LINE('Employee_ID: ' || f_emp_id); 
DBMS_OUTPUT.PUT_LINE('First Name: ' || f_first_name); 
DBMS_OUTPUT.PUT_LINE('Last Name: ' || f_last_name); 
DBMS_OUTPUT.PUT_LINE('Job: ' || f_job_title); 
END; 

ich die folgende Fehlermeldung erhalten:

Error report - 
ORA-01422: exact fetch returns more than requested number of rows 
ORA-06512: at "SYSTEM.FN_EMPS_PER_DEPT_JC450912", line 5 
ORA-06512: at line 10 
01422. 00000 - "exact fetch returns more than requested number of rows" 
*Cause: The number specified in exact fetch is less than the rows returned. 
*Action: Rewrite the query or change number of rows requested 

ich den Lösungscode für die Ausführung Körper müssen diesen Fehler zu beheben.

+0

Ihre letzte Einfügung 'INSERT INTO EMPLOYEES (MITARBEITER ...... TO_DATE ('15/1/2013 ',' DD/MM/YYYY ')' ist unvollständig, es verursacht Parsing Fehler 'SQL Error: ORA- 00917: fehlendes Komma " – krokodilko

+0

Ich habe das bereits bearbeitet und behoben. Aber ich suche Lösungscode für den Ausführungskörper. Das ist das einzige, was ich reparieren muss. Die Funktion wurde erfolgreich erstellt. Aber ich stecke fest mit der Ausführungs-Syntax Wäre hilfreich, wenn Sie den Lösungscode für den Ausführungsteil bereitstellen können – learningIT

+0

Eigentlich haben Sie noch nicht alles behoben - Superman fehlt immer noch eine Job_ID, Gehalt und Abteilungs-ID –

Antwort

3

Bitte verwenden Sie zuerst die moderne Joinsyntax (ANSI-Standard seit 92!).

So SELECT sein sollte:

SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,JOB_TITLE 
INTO f_emp_id,f_first_name,f_last_name,f_job_title 
FROM EMPLOYEES INNER JOIN JOBS ON JOBS.JOB_ID = EMPLOYEES.JOB_ID 
INNER JOIN DEPARTMENT ON DEPARTMENT.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID 
WHERE EMPLOYEES.DEPARTMENT_ID = f_dept_id; 

Weiter, wenn Sie ein Problem wie diese zu erhalten, sollten Sie nur die Abfrage in einem Abfrage-Fenster ausführen, wie folgt aus:

SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,JOB_TITLE 
FROM EMPLOYEES INNER JOIN JOBS ON JOBS.JOB_ID = EMPLOYEES.JOB_ID 
INNER JOIN DEPARTMENT ON DEPARTMENT.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID 
WHERE EMPLOYEES.DEPARTMENT_ID = 1; 

Diese offenbaren Die Ursache Ihres Problems, wie die Ausgabe so aussieht

EMPLOYEE_ID FIRST_NAME   LAST_NAME     JOB_TITLE       
----------- -------------------- ------------------------- ----------------------------------- 
      1 Tony     Starc      IT Administrator     
      2 Bruce    Wayne      IT Administrator     
      3 Larry    Ellison     IT Administrator     

Ie das Feld employees.departme nt_id ist nicht eindeutig. Daher versucht die Stored Procedure bei der Ausführung mehrere Werte in eine einzige Variable zu schreiben. Das kann es nicht, daher der Fehler. Die Prozedur kompiliert ok, weil die Prozedur zur Kompilierzeit keine Ahnung haben kann, dass ein Parameter übergeben wird, der zu mehr als einem Datensatz in der Ergebnismenge führt.

+0

Ich habe Job-ID und Gehalt für Clark Kent (Superman) neu bearbeitet und hinzugefügt Die Aufgabenfrage fordert mich auf, eine Funktion mit Abteilungs-ID als Eingabeparameter und anderen ausgewählten Spalten als Ausgabeparameter zu erstellen. Ich stecke einfach im Ausführungsteil fest.Es wäre sehr hilfreich, wenn Sie nur die Lösung für den Ausführungsteil bereitstellen können. – learningIT

+0

Bitte lesen Sie meine Antwort. Angesichts Ihrer Daten kann es keine Lösung geben. Meine beste Vermutung ist, dass Sie Ihren Auftrag falsch haben. Entweder sollte der Eingabeparameter employee_id (nicht department_id) sein oder es wird erwartet, dass Sie einen einzelnen Ausgabeparameter haben, der ein Recordset ist (mit sys_refcursor). –

+0

Ich habe Abteilung ID gelöscht und Mitarbeiter-ID als Eingabeparameter und dann habe ich meine Funktion Ausführungslogik es funktioniert und ich bekomme das Ergebnis durch Eingabe einer gültigen Mitarbeiter-ID-Nummer und erhalten Fehler bei der Eingabe ungültige Mitarbeiter-ID. Wenn ich Mitarbeiter-ID als Eingabeparameter verwende, funktioniert es perfekt. Aber wenn ich Abteilungs-ID als Eingabeparameter verwende, um Mitarbeiterdetails zu erhalten, wird ein Fehler angezeigt. Es ist nicht so, weil ich bereits EMPLOYEES.DEPARTMENT_ID = f_dept_id angegeben habe. Das ist seltsam für mich. – learningIT

Verwandte Themen