2017-05-28 1 views
0

Ich habe diese:Oracle SQL Concat beunruhigt

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

Und

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; 

Dann das Problem:

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; 

Ich möchte alle ausgewählten Elemente verketten eine einzigartige zurückzukehren varchar von allen.

Es scheint, dass es ein Fehler in der Leitung ist SELECT concat(to_char(t.idmovie) || t.title || t.genere || to_char(t.year)) INTO all

Aber angeblich all scheint richtig?

Mögliche Antworten?

+2

"Es scheint, dass es ein Fehler ist". Warum? Welchen Fehler bekommst du? – APC

Antwort

1

"Aber angeblich all scheint richtig?"

Bis zu einem gewissen Punkt.

ALL ist ein reserviertes Oracle-Wort, daher ist es eine schlechte Wahl des Variablennamens. Verwenden Sie stattdessen etwas anderes, auch l_all.

CONCAT() nimmt zwei Argumente; Sie liefern nur einen. Da Sie den Verkettungsoperator || verwenden, müssen Sie CONCAT() nicht aufrufen. Dies funktioniert

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

Auch die Syntax für die Referenzierung des Typs ist falsch. Dies wird kompiliert ...

... aber es kann nicht sein, was Sie implementieren möchten.

+0

Danke <3! : D. –

0

ALL und DATE sind reservierte Wörter - Sie möchten etwas anderes anstelle dieser Namen verwenden. Sie müssen CONCAT(str1,str2) nicht verwenden (und Sie liefern nur ein einzelnes Argument), da Sie den Verkettungsoperator || verwenden.

Sie können nur DEREF() verwenden:

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