PLS-00488: объект "строка" должен быть типом или подтипом - но это тип - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь построить предложение, используя UDT, следующим образом:

CREATE OR REPLACE TYPE fv_group as object(
fv NUMBER,
group_number INTEGER
);
/

CREATE OR REPLACE TYPE fv_group_array IS VARRAY(100) OF fv_group;

CREATE OR REPLACE TYPE fv_grouping AS OBJECT (
 fv_and_group fv_group_array,
 MEMBER PROCEDURE insert_groupby(FV NUMBER),
 MEMBER FUNCTION which_group(FV NUMBER) RETURN INTEGER
);
/

CREATE OR REPLACE TYPE BODY fv_grouping as
 MEMBER PROCEDURE insert_groupby(FV NUMBER) IS
    g fv_group;
BEGIN
    IF fv < 15 THEN
        g := fv_group(fv,1);
    ELSE
        g := fv_group(fv,2);
    END IF;
            fv_and_group.extend(1);
        fv_and_group(fv_and_group.last) := g;
END;
MEMBER FUNCTION which_group(FV NUMBER) RETURN INTEGER IS
feature NUMBER;
BEGIN
    FOR i IN 1..fv_and_group.count LOOP
        feature := fv_and_group(i).fv;
        IF  fv_and_group(i).fv = fv THEN
            RETURN fv_and_group(i).group_number;
        END IF;
    END LOOP;
    RETURN 0;
END;
END;
/

Нужное мне представление:

DECLARE
     obj fv_grouping;
BEGIN

 SELECT :obj.which_group(gb.fv), count(*)
 FROM (
   SELECT :obj.insert_groupby(c.fv, 6, 3)
   from  cophir
   ) gb
   GROUP BY :obj.which_group(gb.fv);

END; 
/

Процедура insert_groupby вставляет каждое значение таблицы cophir в массив, который содержит его значения и соответствующую группу. После того, как varray загружен со всеми значениями и соответствующей им группой, я хочу сгруппировать их. Возможно ли сделать это в запросе? Заранее спасибо!

1 Ответ

0 голосов
/ 08 ноября 2018

группировка является типом. Что не так?

GROUPING - это ключевое слово Oracle . Если вы переименуете свой тип в FV_GROUPING, вы решите PLS-00488. Что позволит вам устранить все другие синтаксические ошибки в вашем коде:

  1. Тип объекта неправильно создан в запросе.
  2. Операторы SELECT, встроенные в PL / SQL, должны выбираться в переменную, соответствующую проекции запроса.

Не уверен, что ваш код пытается достичь, но эта версия вашего кода работает:

DECLARE
     obj fv_grouping;
BEGIN

   SELECT fv_grouping(cast(collect(fv_group(fv, 3)) as fv_group_array))
   into obj
   from  cophir;

   dbms_output.put_line(obj.which_group(2)) ;

END; 
/

Используется COLLECT для сбора объектов fv_group в экземпляр fv_group_array, который можно использовать для создания экземпляра fv_grouping и заполнения переменной obj.

...