У меня есть это:

CREATE or replace TYPE type_movie AS object(
idmovie    numeric(6),
title        varchar(50),
genere       varchar(20),
year        numeric(4),
refprojec ref type_projec, 
MEMBER FUNCTION getProjec1 return numeric
);

А также

CREATE or replace TYPE type_projec AS object(
idmovie numeric(6),
date        date,
hour        char(5),
refmovie ref type_movie,
MEMBER FUNCTION getData return varchar
);


create table tmovie of type_movie;
create table tprojec of type_projec;

Тогда проблема:

create or replace TYPE BODY type_projec AS
  MEMBER FUNCTION getData return varchar is
  all varchar;
  BEGIN
    SELECT concat(to_char(t.idmovie) || t.title || t.genere || to_char(t.year)) INTO all
    FROM tmovie t
    WHERE t.refmovie.idmovie=self.idmovie;

    return all;
  END;
END;

Я хочу объединить все выбранные элементы, чтобы вернуть уникальный varchar из всех них.

Кажется, в строке SELECT concat(to_char(t.idmovie) || t.title || t.genere || to_char(t.year)) INTO all есть ошибка

Но предположительно all кажется правильным?

Любые возможные ответы?

0
Joan Dot 29 Май 2017 в 00:10

2 ответа

Лучший ответ

"Но якобы all кажется правильным?"

До точки.

ALL является зарезервированным словом Oracle, поэтому это неправильный выбор имени переменной. Вместо этого используйте что-нибудь еще, даже l_all.

CONCAT () принимает два аргумента; Вы поставляете только один. Поскольку вы используете оператор конкатенации ||, вам не нужно вызывать CONCAT (). Это будет работать

SELECT to_char(t.idmovie) || t.title || t.genere || to_char(t.year) INTO l_all

Кроме того, синтаксис для ссылки на тип является неправильным. Это скомпилирует ...

 WHERE t.idmovie=self.idmovie;

... но это может быть не то, что вы хотите реализовать.

1
APC 28 Май 2017 в 21:38

ALL и DATE являются зарезервированными словами - вы хотите использовать что-то другое вместо этих имен. Вам не нужно использовать CONCAT(str1,str2) (и вы предоставляете только один аргумент), так как вы используете оператор конкатенации ||.

Вы можете просто использовать DEREF():

create or replace TYPE BODY type_projec AS
  MEMBER FUNCTION getData return varchar is
   str varchar(4000);
  BEGIN
    SELECT DEREF( self.refmovie ).idmovie
           || DEREF( self.refmovie ).title
           || DEREF( self.refmovie ).genere
           || DEREF( self.refmovie ).year
    INTO   str
    FROM   DUAL;

    return str;
  END;
END;
/
0
MT0 28 Май 2017 в 21:51