Oracle SQL Concat困扰

时间:2017-05-28 21:10:14

标签: oracle user-defined-types

我有这个:

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似乎是正确的?

任何可能的答案?

2 个答案:

答案 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)

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;
/