当前位置: 首页 > 知识库问答 >
问题:

PLS-00103:在预期下列之一时遇到符号“=”....在PL/SQL脚本中

刘阳舒
2023-03-14
create or replace function lstnation (listdisplay in varchar2)
return varchar2 is
    nName varchar2 (1000) default null;
    listD varchar2(1000) default null;
    
    cursor display_nation
    is
            select nation.n_name 
            from nation
            inner join region
            on region.r_regionkey = nation.n_nationkey
            where region.r_regionname = listdisplay;
BEGIN
    open display_nation;
    loop
    fetch display_nation into nName;
        exit when display_nation%notfound;
        IF
           listD := listD || RTRIM(nName)||' , ';
    end loop;
    close display_nation;
    return listD;
end lstnation;
/
DECLARE 
    rKey region.r_regionkey%type;
    rName region.r_name%type;
    nList varchar2(1000);
    cursor outer_block is 
        select region.r_regionkey, region.r_name, lstnation(region.r_name)
        from region;
BEGIN
    open outer_block;
        loop
            fetch outer_block into rKey, rName, nList;
        exit when outer_block%notfound;
        dbms.output.put_line(rkey || ' ' || RTRIM(rName) || ': '|| nList);
         end loop;
         close outer_block;
end;
/

行/COL错误

19/12 PLS-00103:当期望下列之一时遇到符号“=”:。(*@%&=-+at in是mod余数而不是rem,那么<指数(**)><>或!=或~=>=<=<>和或类似于2类似于4类似于多集成员子多集之间的

20/2 PLS-00103:当需要下列操作之一时遇到符号“end”:begin函数pragma过程子类型类型当前游标删除存在之前

共有1个答案

符鸿光
2023-03-14

通过使用listagg函数替换游标循环,可以节省一些编码和效率

    select listagg(rtrim(nation.n_name),',')
    from nation
    inner join region
    on region.r_regionkey = nation.n_nationkey
    where region.r_regionname = listdisplay;

因此它将整理所有匹配的行,并使用传入的分隔符。需要注意的一点是,您有listd varchar2(1000),所以只要查询的结果小于1000,就可以了。如果希望得到更大的结果集,则可能需要增加或使用CLOB。

如果出于某种原因,您仍然希望使用循环方法,那么您需要修复If语句:

loop
    fetch display_nation into nName;
        exit when display_nation%notfound;
        IF <condition> THEN
           listD := listD || RTRIM(nName)||' , ';
        END IF;
    end loop;
 类似资料: