【问题标题】:create procedure sql success with compilation error创建过程 sql 成功但编译错误
【发布时间】:2020-12-13 22:17:35
【问题描述】:

我是 sql 初学者,学习程序、函数和匿名块。我检查了我的代码,没有发现拼写错误导致编译错误。你能帮我理解我在这里做错了什么吗?这是问题 4. 将文件 show_class_offerings.sql 转换为过程。接受开始日期和结束日期。对于找到的每个班级,显示 CLASS_ID、START_DATE、讲师 FIRST_NAME 和 LAST_NAME、课程 TITLE 和 SECTION_CODE 以及平均成绩。通过调用函数 compute_average_grade 查找平均成绩。

CREATE OR REPLACE PROCEDURE show_class_offerings
 (p_start_date IN DATE,
  p_end_date IN DATE)
   IS
  v_avg_grade NUMBER;
   IS
  CURSOR classes_info_cur IS
   SELECT cl.class_id, cl.start_date, i.first_name,
     i.last_name, co.title, co.section_code
  FROM classes cl, courses co, instructors i
  WHERE start_date BETWEEN p_start_date AND p_end_date
    AND cl.course_id = co.course_id
    AND cl.instr_id = i.instructor_id;
  BEGIN
  DBMS_OUTPUT.PUT_LINE ('Date range: Between ' ||
  p_start_date || ' and ' || p_end_date || '.');
  DBMS_OUTPUT.PUT_LINE('Classes Information.');
   FOR classes_info_rec IN classes_info_cur 
  LOOP
   v_avg_grade := compute_average_grade(classes_info_rec.class_id);
  DBMS_OUTPUT.PUT_LINE(
  'Class ID' || classes_info_rec.class_id ||
  '-Average Grade' || v_avg_grade ||
  '-Start Date' || classes_info_rec.start_date ||
  '-Instructor' || classes_info_rec.first_name ||
   classes_info_rec.last_name ||
  '-Course Title' || classes_info_rec.title ||
  '-Offering Section' || classes_info_rec.section_code);
   END LOOP;
    END show_class_offerings;

错误:ORA-24344:编译错误成功

【问题讨论】:

  • SQL*Plus 告诉您什么?它会将您指向有错误的行号。请编辑问题并添加错误文本。
  • 我不确定,因为对于这个类,我使用 oracle APEX,而不是 sqldeveloper。感谢您花时间回答,我已经编辑并添加了错误文本。
  • 有两个“IS”语句,我会删除第二个。
  • 该消息表示程序已创建但无效,因此其中有错误。
  • 您可以在创建过程后运行select * from user_errors 以获取有关错误的更多详细信息。

标签: sql oracle procedure


【解决方案1】:

删除第二个IS

CREATE OR REPLACE PROCEDURE show_class_offerings(
  p_start_date IN DATE,
  p_end_date   IN DATE
)
IS
  v_avg_grade NUMBER;

  CURSOR classes_info_cur IS
    SELECT cl.class_id,
           cl.start_date,
           i.first_name,
           i.last_name,
           co.title,
           co.section_code
    FROM   classes cl
           INNER JOIN courses co
           ON (cl.course_id = co.course_id)
           INNER JOIN instructors i
           ON (cl.instr_id = i.instructor_id)
    WHERE  start_date BETWEEN p_start_date AND p_end_date;
BEGIN
  DBMS_OUTPUT.PUT_LINE (
    'Date range: Between ' || p_start_date || ' and ' || p_end_date || '.'
  );
  DBMS_OUTPUT.PUT_LINE('Classes Information.');
  FOR classes_info_rec IN classes_info_cur 
  LOOP
    v_avg_grade := compute_average_grade(classes_info_rec.class_id);
    DBMS_OUTPUT.PUT_LINE(
      'Class ID' || classes_info_rec.class_id ||
      '-Average Grade' || v_avg_grade ||
      '-Start Date' || classes_info_rec.start_date ||
      '-Instructor' || classes_info_rec.first_name || classes_info_rec.last_name ||
      '-Course Title' || classes_info_rec.title ||
      '-Offering Section' || classes_info_rec.section_code
    );
  END LOOP;
END show_class_offerings;
/

(注意:您也可以使用 ANSI 连接来代替可读性较差的旧式逗号连接。)

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多