在 MYTABLE 中,有课程及其前身课程。我试图找到在指定课程之后要学习的课程。我缺少选择关键字错误。为什么我收到此错误,尽管我在 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;
除非我错了,否则 WITH 分解子句不能这样使用; 您必须将其用作内联视图,例如:
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 子句是否正确?前辈喜欢课程名称?我不是说这是错误的,只是看起来有些奇怪。
稍微扩展一下@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
( 从行中提取字段。
祝你好运。
创建表产品(PRODUCT_ID int 主键,名称 VARCHAR (20( 不为空,Batchno int not null,速率 int 不为空,税不为空,过期日期不为空);
插入到产品价值(1 , '血管护理', 32 , 15 , 2 , 01-JAN-2021(;