这是作业。
目标是创建一个存储过程,将新值插入到类表中。如果end_date
位于start_date
之前,则默认情况下存储过程需要将两周添加到开始日期。
这是我到目前为止所拥有的:
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,
Teacher_credential_param class.teacher_credential%TYPE)
AS
class_number_var class.class_number%TYPE;
--start_date_var class.start_date%TYPE;
end_date_var class.end_date%TYPE;
BEGIN
-- Creates the next ID
SELECT class_number_seq.NEXTVAL
INTO class_number_var
FROM dual;
IF end_date_param < start_date_param THEN
SELECT end_date_param INTO end_date_var
FROM class
WHERE class_number_var = class.class_number;
end_date_var := start_date_param + 14;
ELSE
end_date_var := end_date_param;
END IF;
INSERT INTO class (class_number, teacher_name, class_name, start_date, end_date,
class_category, topic, teacher_credential)
VALUES (class_number_var, teacher_name_param, class_name_param, start_date_param, end_date_param,
class_category_param, topic_param, teacher_credential_param);
COMMIT;
END;
/
示例调用语句:
CALL insert_class('Collin Hannah', 'Intro to psychology', 01-OCT-15, 01-SEP-15, 'Psychology', 'Intro Classes', 'BS psychology');
对我来说这看起来很合理。我得到一个&#34;过程insert_class&#34;编译的消息。但是,当我尝试调用该过程时,收到错误消息not a valid function or procedure name
。
如果原始end_date_param值在start_date_param之前,我假设end_date_var
将代替end_date_param
。它是否正确?如果我尝试将end_date_var和end_date_param放在VALUES
语句的INSERT INTO
部分中,则会导致整个事情失去平衡。
答案 0 :(得分:1)
试试这个。从编译结束好像程序好。只是添加始终正确的日期格式,如下所示。让我知道这是否有帮助。
BEGIN
insert_class('Collin Hannah', 'Intro to psychology', TO_DATE('01-OCT-15','DD-MON-YY'), TO_DATE('01-SEP-15','DD-MON-YY'), 'Psychology', 'Intro Classes', 'BS psychology');
END;
--OR
EXEC insert_class('Collin Hannah', 'Intro to psychology', TO_DATE('01-OCT-15','DD-MON-YY'), TO_DATE('01-SEP-15','DD-MON-YY'), 'Psychology', 'Intro Classes', 'BS psychology');
答案 1 :(得分:0)
CALL insert_class
不是有效的功能或程序名称
CALL 不是执行过程的有效语法。您需要在SQL * Plus中 EXECUTE ,或在 PL / SQL 块中调用它。
SQL> create or replace procedure p
2 as
3 begin
4 null;
5 end;
6 /
Procedure created.
SQL> sho err
No errors.
创建了程序。
错误重现
SQL> CALL p;
CALL p
*
ERROR at line 1:
ORA-06576: not a valid function or procedure name
正确的方式
SQL> EXEC p;
PL/SQL procedure successfully completed.
此外,
01-OCT-15
01-OCT-15
不是有效的 DATE 。您应该使用 TO_DATE 或 ANSI Date literal 将文字显式转换为日期。
例如,
TO_DATE('01-OCT-2015', 'DD-MON-YYYY','NLS_DATE_LANGUAGE=ENGLISH')
请注意, TO_DATE 依赖于 NLS 。
由于您不关心时间部分,我更倾向于使用 ANSI Date literal ,它使用固定的日期格式'YYYY-MM-DD'
。
例如,
DATE '2015-10-01'