我有这个:
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。
似乎行[{1}}
中存在错误但据说SELECT concat(to_char(t.idmovie) || t.title || t.genere || to_char(t.year)) INTO all
似乎是正确的?
任何可能的答案?
答案 0 :(得分:1)
"但据说
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 :(得分:0)
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;
/