2015-10-31 95 views
0

請幫我一下這個存儲過程的語法嗎?這是在oracle的SQL開發人員中完成的。PL/SQL存儲過程

存儲過程的目的是允許CALL函數中插入新的記錄到類表(其上創建使用以下語法):

CREATE TABLE class 
(
class_number NUMBER(8), 
teacher_name VARCHAR2(50), 
class_name VARCHAR2(50) NOT NULL, 
start_date DATE, 
end_date DATE, 
class_category VARCHAR2(20), 
topic VARCHAR2(20), 
teacher_credential VARCHAR2(40), 
CONSTRAINT pk_class PRIMARY KEY (class_number,teacher_name,class_name,start_date) 
); 

隨着存儲的過程和順序如下編碼,應該創建一個新類,如果結束日期在開始日期之前,那麼結束日期應該是默認開始日期+兩週。

CREATE SEQUENCE class_number_seq; 

CREATE OR REPLACE PROCEDURE insert_class 
(
    Teacher_name_param class.teacher_name%TYPE, 
    class_name_param class.class_name%type, 
    start_date_param class.start_date%TYPE , 
    end_date_param class.end_date%TYPE, 
    class_category_param class.class_category%TYPE, 
    topic_param class.topic%TYPE, 
    end_date_param class.end_date%TYPE 
) 
    AS 
     class_number_var class.class_number%TYPE; 
     end_date_var class.end_number%TYPE; 


BEGIN 
    SELECT class_number_seq.NEXTVAL INTO class_number_var FROM dual; 

    IF end_date_param < start_date_param OR end_date_param IS NULL THEN 
    end_date_param := start_date_param + 14; 
    ELSE 
     end_date_var := end_date_param; 
    END IF; 
    INSERT INTO class 
    VALUES(class_number_var, teacher_name_param, class_name_param, start_date_param, end_date_param, class_category_param, topic_param); 
    END; 

錯誤我得到是:

PL/SQL complilation單元分析終止:在 RECORD,TABLE或列出的參數重複場是不允許的。

我不確定我的邏輯是否有什麼問題 - 或者重複字段是什麼地方。

請幫忙!

回答

5

end_date_param class.end_date%TYPE在過程的參數列表中列出兩次。刪除其中一個應該修復這個錯誤。

CREATE OR REPLACE PROCEDURE insert_class ( Teacher_name_param class.teacher_name%TYPE, class_name_param class.class_name%type, start_date_param class.start_date%TYPE , end_date_param class.end_date%TYPE, class_category_param class.class_category%TYPE, topic_param class.topic%TYPE, end_date_param class.end_date%TYPE )

我認爲有以下行有一個錯字

end_date_var class.end_numberdate%TYPE;

下面的語句可能會導致一個錯誤,因爲end_date_param是不是OUT參數中聲明。所以end_date_param這裏也許應該改爲end_date_var

IF end_date_param < start_date_param OR end_date_param IS NULL THEN end_date_paramvar := start_date_param + 14; ELSE

insert語句提供了7個值,而該表有8列。

INSERT INTO class 
VALUES(class_number_var, teacher_name_param, class_name_param, 
start_date_param, end_date_param, class_category_param, topic_param); 

這可能會導致值錯誤太少。

它通常是更好地寫爲

INSERT INTO class 
(class_number, teacher_name, class_name, 
start_date, end_date, class_category, topic) 
VALUES(class_number_var, teacher_name_param, class_name_param, 
start_date_param, end_date_param, class_category_param, topic_param); 

,所以我們可以很容易地驗證並避免錯誤。