Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PLSQL错误:在过程中应为时遇到符号_Oracle_Stored Procedures_Plsql_Nested Table - Fatal编程技术网

Oracle PLSQL错误:在过程中应为时遇到符号

Oracle PLSQL错误:在过程中应为时遇到符号,oracle,stored-procedures,plsql,nested-table,Oracle,Stored Procedures,Plsql,Nested Table,我是PL/SQL新手,编写了一个过程,无法发现错误。 实施细节: 我使用几个游标遍历一个表,并将一些相关数据存储在嵌套表中(TYPE..IS table OF varchar(8)) 具体来说,表中的先决条件存储了给定课程的prereq课程。我必须找到给定课程的直接预科和预科的预科(如果有)。 代码: 这里是预冷 TYPE precoll IS TABLE of varchar2(8); 在包中声明,下面的过程在包体中。程序: procedure disp_prereq(p_dept_code

我是PL/SQL新手,编写了一个过程,无法发现错误。
实施细节:
我使用几个游标遍历一个表,并将一些相关数据存储在嵌套表中
(TYPE..IS table OF varchar(8))

具体来说,表中的先决条件存储了给定课程的prereq课程。我必须找到给定课程的直接预科和预科的预科(如果有)。
代码:
这里是预冷

TYPE precoll IS TABLE of varchar2(8);
在包中声明,下面的过程在包体中。程序:

procedure disp_prereq(p_dept_code IN varchar2, p_courseno IN number, c_prereq OUT SYS_REFCURSOR)
IS
counter INTEGER ;
preserved INTEGER ;
prelist precoll := precoll();
row prerequisites%ROWTYPE;
BEGIN
        counter := 1;
        preserved := 1;
    cursor cr is select * from prerequisites where dept_code = p_dept_code and course# = p_courseno;
        open cr;
        loop
                fetch cr into row;
                exit when row%notfound;
                prelist(counter) := (row.pre_dept_code || row.pre_course#) ;
                counter := counter + 1;
        end loop;
        close cr;
        preserved := prelist.count;
        preserved := preserved + 1;
        counter := 1;
        cursor indr is select * from prerequisites;
        open indr;
        loop
                fetch indr into row;
                exit when row%notfound;
                if (prelist(counter) = (m.dept_code||m.course#)) then
                        prelist(preserved) := m.pre_dept_code||m.pre_course# ;
                        preserved := preserved + 1;
                end if;
                counter := counter + 1;
        end loop;
        close indr;
        open c_prereq FOR select * from prelist;
END disp_prereq;
显示错误给了我:

62/9     PLS-00103: Encountered the symbol "CR" when expecting one of the
         following:
         := . ( @ % ;

62/9 PLS-00103:在期望一个
以下:
:= . ( @ % ;
我的第二个问题, prelist是precoll的变量(precoll类型是varchar2(8)的表)
我可以通过select查询查询类型precoll吗,因为它是varchar表?

问题1:应该在过程的声明bart中声明游标。移动:

cursor cr is select * from prerequisites where dept_code = p_dept_code and course# = p_courseno;
开始
之前的行到。另一个游标(indr)也是如此。(还有一种替代语法,您可以在声明部分声明游标变量,然后使用
打开游标变量选择…

问题2:是的,就你而言:

在声明部分:

prelist precoll;
cur cursor;
在代码部分:

open cur for 
  SELECT * FROM table(prelist);

下面是另一个例子。

光标
CR
声明应在
开始
关键字之前移动(在声明部分)。谢谢,您准确地回答了我的查询,我将尝试此操作。第一个问题已解决。但第二个问题是,未找到表'prelist',没有此类表。我应该在查询中写入什么,该类型的类型名称或变量名称?类型名称:precoll。变量名称:prelist。您需要告诉PL/SQL“导出”通过编写
table(prelist)
将表转换为SQL。我在回答的问题2中添加了更多的文本。