2016-05-11 9 views
-1

Ich versuche, die CAST Funktion zu verwenden, um die Ausgabe einer Spalte in einer Abfrage von VARCHAR2 (255 CHAR) zu VARCHAR2 einer variablen Länge, das Finale zu konvertieren Nummer von einer Unter Abfrage zurückgegeben werden, wie folgt aus:ORACLE - Legen Sie die Länge für eine varchar2 Länge basierend auf einer Abfrage

SELECT CAST(Title as VARCHAR2(SELECT MAX(LENGTH(Title)) FROM Books)) 
FROM Books; 

Wer weiß, ob es möglich ist für mich die Ausgabe als VARCHAR2 mit der Länge von der Unterabfrage zurück zu formatieren? Für das obige Beispiel bekomme ich immer Fehler, aber es könnte andere Wege geben.

+2

Es macht nicht viel Sinn, zu einem unsized varchar2 zu werfen; Wenn Ihre Spalte bereits ein varchar2 ist, brauchen Sie vielleicht keine Besetzung. Was musst du tun? Bitte geben Sie den relevanten Code ein, für den Sie diese Abfrage verwenden möchten. – Aleksej

+2

Warum versuchen Sie dies? Was ist das Problem, das du damit lösen willst? – Boneist

+1

Das Interesse von 'varchar2' ist, dass es in der Länge variiert, oder? Warum also seinen Typ auf einen anderen ändern? Suchen Sie nach einer Möglichkeit, am Ende zusätzliche Leerzeichen zu entfernen? Sie können dazu 'trim (Title)' verwenden. –

Antwort

0

Was Sie versuchen, ist nicht möglich.

SQL per definitionem hat ein statisches System, d. H. Die Anzahl der Ergebnisspalten und deren Namen und Typen werden vor dem Ausführen der Anweisung bestimmt (und nachdem die Anweisung analysiert wurde).

0

Sie können es mit dynamischen SQL tun. Eine Lösung, die in SQL Developer funktioniert, ist:

VARIABLE cur REFCURSOR; 

DECLARE 
    p_max_length INT; 
BEGIN 
    SELECT MAX(LENGTH(title)) 
    INTO p_max_length 
    FROM Books; 

    OPEN :cur FOR 
    'SELECT CAST(Title AS VARCHAR2(' || p_max_length || ')) FROM Books'; 
END; 
/

PRINT cur; 

jedoch Ich habe Probleme zu verstehen, warum Sie dies tun möchten, wie der Titel bereits eine VARCHAR2(255) (so bereits variable Länge) und die maximale Reduzierung Kapazität wird nicht die Größe der Daten reduzieren.

Sie können sehen, dass sie gleich sind, indem Sie:

SELECT DUMP(Title) FROM Books; 

und es auf die Abfrage zu vergleichen dies oben anstelle:

OPEN :cur FOR 
'SELECT DUMP(CAST(Title AS VARCHAR2(' || p_max_length || '))) FROM Books'; 

und Sie werden sehen, dass die zurückgegebenen Daten ist identisch in beide Fälle.

Verwandte Themen