2015-10-31 38 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); 

,所以我们可以很容易地验证并避免错误。