0

在 MYTABLE 中有课程及其前身课程。我想要的是在指定课程之后找到要学习的课程。我缺少 SELECT 关键字错误。为什么我在 FOR 语句中有 SELECT 语句时收到此错误?我在哪里做错了?

DECLARE
  coursename varchar2(200) := 'COURSE_101';
  str        varchar2(200);
BEGIN
  WITH DATA AS
    (select (select course_name 
             from MYTABLE 
             WHERE predecessors like ('''%' || coursename||'%''') 
            ) str
     from dual
    )
    FOR cursor1 IN (SELECT str FROM DATA) 
    LOOP
      DBMS_OUTPUT.PUT_LINE(cursor1);
    END LOOP;
end;
4

3 回答 3

4

除非我错了,否则不能那样使用 WITH factoring 子句;您必须将其用作内联视图,例如:

declare
  coursename varchar2(200) := 'COURSE_101';
  str        varchar2(200);
begin
  for cursor1 in (select str 
                  from (select (select course_name 
                                from mytable 
                                where predecessors like '''%' || coursename||'%'''
                               )  str
                        from dual
                       )
                 ) 
  loop
    dbms_output.put_line(cursor1.str);
  end loop;
end;
/

除了它不起作用(错误的 LIKE 条件)这一事实之外,你把它过度复杂化了。这就是它实际上做某事的方式:

SQL> create table mytable(course_name  varchar2(20),
  2                       predecessors varchar2(20));

Table created.

SQL> insert into mytable values ('COURSE_101', 'COURSE_101');

1 row created.

SQL>
SQL> declare
  2    coursename varchar2(20) := 'COURSE_101';
  3  begin
  4    for cursor1 in (select course_name str
  5                    from mytable
  6                    where predecessors like '%' || coursename || '%'
  7                   )
  8    loop
  9      dbms_output.put_line(cursor1.str);
 10    end loop;
 11  end;
 12  /
COURSE_101

PL/SQL procedure successfully completed.

SQL>

另外,那个 WHERE 子句正确吗?像 COURSENAME 这样的前辈?我并不是说这是错误的,只是看起来有些奇怪。

于 2018-04-07T19:41:38.360 回答
1

稍微扩展@Littlefoot 的答案:您可以在游标中使用公用表表达式(WITH 子句),但 WITH 必须是游标 SELECT 语句的一部分,而不是与之分开:

DECLARE
  coursename varchar2(200) := 'COURSE_101';
BEGIN
  FOR aRow IN (WITH DATA AS (select course_name AS str
                               from MYTABLE 
                               WHERE predecessors like '''%' || coursename||'%''')
               SELECT str FROM DATA)
  LOOP
    DBMS_OUTPUT.PUT_LINE(aRow.str);
  END LOOP;
END;

另请注意,游标 FOR 循环中的迭代变量表示游标的 SELECT 语句返回的行,因此如果要显示游标返回的任何内容,则必须使用点分变量表示法(例如aRow.str)从行中提取字段.

祝你好运。

于 2018-04-07T20:12:45.467 回答
0

CREATE TABLE 产品( PRODUCT_ID int 主键,NAME VARCHAR (20) not null,Batchno int not null,Rate int not null,Tax int not null,Expiredate date not null);

插入产品价值(1 , 'vasocare', 32 , 15 , 2 , 01-JAN-2021);

于 2021-11-30T05:19:28.530 回答