【问题标题】:I'm getting these 2 errors and i can't fix them我收到这 2 个错误,我无法修复它们
【发布时间】:2019-05-29 11:04:22
【问题描述】:

错误报告 -
ORA-06550:第 6 行,第 5 列:
PLS-00382:表达式类型错误
ORA-06550:第 6 行,第 5 列:
PL/SQL:忽略 SQL 语句
06550. 00000 - “第 %s 行,第 %s 列:\n%s”
*原因:通常是 PL/SQL 编译错误。
*行动:

这是代码:

SET SERVEROUTPUT ON;

CREATE OR REPLACE FUNCTION NUMBEROFHOTELS
    RETURN SYS_REFCURSOR AS
    cur_nbOfHotels SYS_REFCURSOR;
    BEGIN
    OPEN cur_nbOfHotels FOR
     SELECT COUNT(*), s.REGION 
     FROM HOTEL h, STATION s
     WHERE h.NUM_STATION = s.NUM_STATION AND h.CATEGORIE='3star'
     GROUP BY s.REGION;
    RETURN cur_nbOfHotels;
END NUMBEROFHOTELS;
/

show errors;

DECLARE
    V_nbHotels number :=0;
    v_reg STATION.REGION%TYPE;
    cur_nbhotels SYS_REFCURSOR := NUMBEROFHOTELS();
    BEGIN
    OPEN cur_nbhotels;
        LOOP
            FETCH cur_nbhotels INTO V_nbHotels,v_reg;
            EXIT WHEN cur_nbhotels%notfound;
            DBMS_OUTPUT.PUT_LINE(v_reg||' '||V_nbHotels);
        END LOOP;   
    CLOSE cur_nbhotels;
END;
/

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    在底部的匿名 PL/SQL 块中删除以下行:

        OPEN cur_nbhotels;
    

    光标已在您的NUMBEROFHOTELS 函数中打开。您无需再次打开它。

    我拿走了你的代码,删除了那行,它在我制作的一些示例数据上成功运行。

    【讨论】:

      【解决方案2】:

      您不需要在第二个块中打开光标,因为它已经在您的第一个块中打开。有关更多详细信息,请查看此问题的答案。 Returning a ref cursor from a Oracle Function

      【讨论】:

        【解决方案3】:

        如果你在做一个例子,那很好,但你应该记住避免这条线

        CLOSE cur_nbhotels;
        

        这应该由另一个过程来完成,例如 NUMBEROFHOTELS

        顺便说一句,您可以使用隐式游标并避免 OPEN - CLOSE 的东西。这是您的代码示例

        DECLARE
          CURSOR c_stations
          IS
            SELECT s.region, count(*) n_region 
              FROM hotel h
                  ,station s
             WHERE h.categorie = '3star'
               AND h.num_station = s.num_station
            GROUP BY s.region;
        
        BEGIN
          <<station_loop>>
          FOR r_station IN c_stations
          LOOP
            sys.dbms_output.put_line(r_station.region || ' ' || r_station.n_region);
          END LOOP station_loop;   
        END;
        

        【讨论】:

        • 我知道我能做到,但我不得不使用一个函数,因为它是用于大学项目的,而这正是我的医生想要的
        猜你喜欢
        • 2019-06-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-04
        • 1970-01-01
        • 2021-01-14
        • 2021-03-21
        • 1970-01-01
        • 2018-06-14
        相关资源
        最近更新 更多