Oracle SQL Concat 困扰

Oracle SQL Concat troubled

我有这个:

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;

我想将所有选定的项目连接到 return 所有项目的唯一 varchar。

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

行好像有错误

但据说 all 似乎是正确的?

有可能的答案吗?

"But supposedly all seems correct?"

到一定程度。

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;

...但它可能不是你想要实现的。

ALLDATE 是保留字——您想使用其他名称代替这些名称。您不需要使用 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;
/