【问题标题】:PLSQL - Procedure with multiple recordsPLSQL - 具有多条记录的过程
【发布时间】:2018-11-19 01:25:26
【问题描述】:

创建一个称为先决条件的过程。创建包含四个字段的用户定义记录:course_no、description、cost 和prerequisite_rec。最后一个字段prerequisite_rec 应该是用户定义的记录,包含三个字段:prereq_no、prereq_desc 和 prereq_cost。对于所有具有先修课程的课程,用所有相应的数据填充用户定义的记录,并将其信息显示在屏幕上。

我正在试图弄清楚这个问题,而其中的措辞令人困惑。据我了解,将创建一个过程以及包含 4 个用户定义字段的记录,但是这 4 个字段中的 1 个也是包含 3 个字段的记录本身。

这是正确的吗?

这就是我到目前为止所要做的。

CREATE OR REPLACE PROCEDURE prerequisites (course_no IN NUMBER, 
description OUT VARCHAR2, cost OUT NUMBER, prereq_no OUT NUMBER
,prereq_desc OUT VARCHAR2, prereq_cost OUT NUMBER)
IS
v_course course.course_no%TYPE;

BEGIN
v_course := course_no;
SELECT description, cost, prerequisite
  INTO description, cost, prereq_no
  FROM course
 WHERE course_no = v_course;

SELECT description, cost
  INTO prereq_desc, prereq_cost
  FROM course
 WHERE course_no = prereq_no;


END;
/

DECLARE
TYPE prereqs IS RECORD (prereq_no NUMBER, prereq_desc VARCHAR2(50), prereq_cost NUMBER);
TYPE courses IS RECORD (course_no NUMBER, description VARCHAR2(50), cost NUMBER,
    prerequisite_rec prereqs);

BEGIN
courses.course_no := 25;

prerequisites(courses.course_no, courses.description, courses.cost, prereqs.prereq_no
    ,prereqs.prereq_desc, prereqs.cost);

DBMS_OUTPUT.PUT_LINE(courses.course_no || ' and ' || prereqs.prereq_no);

END;
/

程序很好,但是当我执行主块时出现 ORA-06550 错误。

ORA-06550: line 7, column 5:
PLS-00330: invalid use of type name or subtype name
ORA-06550: line 7, column 5:
PL/SQL: Statement ignored
ORA-06550: line 9, column 19:
PLS-00330: invalid use of type name or subtype name
ORA-06550: line 9, column 5:
PL/SQL: Statement ignored
ORA-06550: line 12, column 26:
PLS-00330: invalid use of type name or subtype name
ORA-06550: line 12, column 5:
PL/SQL: Statement ignored

有什么想法吗?

【问题讨论】:

  • “对于所有有必修课的课程,在用户定义的记录中填充...” - 所以,应该有一个名为 course 什么的表。它的结构是什么?编辑您的问题并显示表格的定义并添加一些示例数据。

标签: stored-procedures plsql oracle12c record


【解决方案1】:

认为您的要求是正确的……您需要在声明类型之前声明子类型。例如(未测试,因为我没有可用的环境)

Declare

 TYPE prerequisite IS RECORD (prereq_no NUMBER, 
    prereq_desc VARCHAR2(50), prereq_cost NUMBER)

 TYPE courses IS RECORD (course_no NUMBER, description VARCHAR2(50), 
    cost NUMBER, prerequisite_rec prerequisite);

v_blah courses;

begin
   do stuff
end;
/

【讨论】:

  • 我尝试过它似乎可以正常工作但目前遇到 ORA-06550
  • @EricSousa 抱歉应该添加最后一点,一旦你声明了类型,你必须使用这些类型声明一个变量。那么你将通过 v_blah.course_no ect 访问它
猜你喜欢
  • 2019-05-24
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
相关资源
最近更新 更多