Я получаю эти 2 ошибки, и я не могу их исправить - PullRequest
0 голосов
/ 02 января 2019

Сообщение об ошибке -
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;
/

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Вам не нужно открывать курсор во втором блоке, так как он уже открыт в вашем первом блоке.взгляните на ответ на этот вопрос для более подробной информации. Возвращение курсора ссылки из функции Oracle

0 голосов
/ 03 января 2019

Если вы делаете что-то вроде примера, это нормально, но вы должны помнить, чтобы избежать этой строки

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;
0 голосов
/ 03 января 2019

Удалите следующую строку в вашем анонимном PL / SQL-блоке внизу:

    OPEN cur_nbhotels;

Курсор уже открыт в вашей функции NUMBEROFHOTELS.Вам не нужно открывать его снова.

Я взял ваш код, удалил эту строку, и он успешно работал на некоторых образцах данных, которые я составил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...