将新值插入类表的存储过程

时间:2015-11-18 09:01:26

标签: oracle plsql

这是作业。

目标是创建一个存储过程,将新值插入到类表中。如果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');
  1. 对我来说这看起来很合理。我得到一个&#34;过程insert_class&#34;编译的消息。但是,当我尝试调用该过程时,收到错误消息not a valid function or procedure name

  2. 如果原始end_date_param值在start_date_param之前,我假设end_date_var将代替end_date_param。它是否正确?如果我尝试将end_date_var和end_date_param放在VALUES语句的INSERT INTO部分中,则会导致整个事情失去平衡。

2 个答案:

答案 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'