【问题标题】:PL/SQL stored proceduresPL/SQL 存储过程
【发布时间】:2015-10-31 05:42:30
【问题描述】:

请帮助我了解这个存储过程的语法?这是在 oracle 的 SQL 开发人员内部完成的。

存储过程的目的是允许 CALL 函数将新记录插入到 CLASS 表中(使用以下语法创建):

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 编译单元分析已终止并且:在 不允许列出 RECORD、TABLE 或参数。

我不确定我的逻辑是否有问题——或者重复字段在哪里。

请帮忙!

【问题讨论】:

    标签: sql oracle stored-procedures plsql


    【解决方案1】:

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

    这样我们就可以轻松验证并避免错误。

    【讨论】:

      猜你喜欢
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多