【问题标题】:ORA-00928: missing SELECT keywordORA-00928: 缺少 SELECT 关键字
【发布时间】:2018-09-17 13:24:41
【问题描述】:

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

【问题讨论】:

    标签: oracle for-loop select plsql ora-00928


    【解决方案1】:

    创建表产品 ( PRODUCT_ID int 主键, 名称 VARCHAR (20) 不为空, 批号 int 不为空, 评价 int 不为空, 税 int 不为空, 过期日期不为空 );

    INSERT INTO PRODUCT VALUSES(1 , 'vasocare', 32 , 15 , 2 , 01-JAN-2021);

    【讨论】:

    【解决方案2】:

    稍微扩展@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)从行中提取字段。

    祝你好运。

    【讨论】:

      【解决方案3】:

      除非我错了,否则不能这样使用 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 子句是否正确? 像课程名称这样的前辈?我不是说它错了,只是看起来有些奇怪。

      【讨论】:

      • 谢谢。你的第二个例子对我有用。实际上像条件没有错,它看起来复杂的原因是我希望它是动态值,因为我的表中有很多数据。再次感谢!
      猜你喜欢
      • 2018-07-23
      • 2018-05-13
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多