2

错误报告 -
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;
/
4

3 回答 3

0

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

    OPEN cur_nbhotels;

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

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

于 2019-01-02T21:00:13.210 回答
0

您不需要在第二个块中打开光标,因为它已经在您的第一个块中打开。有关更多详细信息,请查看此问题的答案。 从 Oracle 函数返回引用游标

于 2019-01-02T21:04:22.013 回答
0

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

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-01-02T22:42:13.700 回答