2017-08-26 35 views
0

這是我創建的表的列表並插入值作爲創建的表:ORACLE PL/SQL函數創建成功,但執行體工作不

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); 

現在在我的分配問題,我有被要求解決以下問題: 編寫一個名爲fn_emps_per_dept_jc450912的函數以檢索具有給定DEPARTMENT_ID的EMPLOYEE_ID,FIRST_NAME,LAST_NAME和JOB_TITLE。此函數應將DEPARTMENT_ID作爲輸入參數,此函數應具有EMPLOYEE_ID,FIRST_NAME,LAST_NAME和JOB_TITLE作爲輸出參數。它應該返回TRUE,如果找到則返回FALSE。

爲了從一個特定部門顯示員工的信息,我寫了下面的功能:

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 

,該功能已成功編譯正如你可以從上面看到的。

然後我試圖執行的功能:

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; 

,我發現了以下錯誤:

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 

我需要的解決方案代號爲執行主體來修復這個錯誤。

+0

您上次插入INSERT INTO EMPLOYEES(EMPLOYEE ...... TO_DATE('15/1/2013','DD/MM/YYYY')'是不完整的,它會導致解析錯誤SQL錯誤:ORA- 00917:missing comma' – krokodilko

+0

我已經編輯並解決了這個問題,但是我正在尋找執行體的解決方案代碼,這是我唯一需要解決的問題,該函數已經成功創建。執行語法如果你能爲執行部分提供解決方案代碼,這將會很有幫助 – learningIT

+0

其實你還沒有修復它 - 超人仍然缺少Job_ID,薪水和department_id –

回答

3

首先請使用現代連接語法(從92開始的ANSI標準!)。

所以,你的選擇應該是:

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; 

下,當你得到這樣的問題,你應該只運行查詢的查詢窗口,如下:

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; 

這將揭示你的問題的原因,因爲輸出看起來像這樣

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

即,該領域employees.departme nt_id不是唯一的。因此在執行時,存儲過程試圖將多個值放入一個變量中。這是它不能做的,因此錯誤。該過程編譯好,因爲在編譯時,過程不知道它會傳遞一個參數,這會導致結果集中有多個記錄。

+0

我已經重新編輯並添加了克拉克肯特(超人)的工作ID和薪水。呃,分配問題要求我創建一個以部門ID作爲輸入參數和其他選定列作爲輸出參數的函數。我只是卡在執行部分。如果您只能爲執行部分提供解決方案,那將非常有幫助。 – learningIT

+0

請閱讀我的回答。鑑於你的數據,可能沒有解決方案。我最好的猜測是你的任務不對。輸入參數應該是employee_id(不是department_id),或者您需要有一個記錄集的單個輸出參數(使用sys_refcursor)。 –

+0

我已經刪除了部門ID並且包含了員工ID作爲輸入參數,然後我應用了我的功能執行邏輯,它可以工作,並且通過輸入有效的員工ID號並在輸入無效員工ID時出錯。當我使用員工ID作爲輸入參數時,它完美地工作。但是,當我將部門ID作爲輸入參數來獲取員工詳細信息時,它顯示錯誤。它不應該是因爲我已經指定了EMPLOYEES.DEPARTMENT_ID = f_dept_id。所以這對我來說很奇怪。 – learningIT