# Oracle9 datatype fuer View festlegen



## SQLstruggle (4. Oktober 2005)

Hallo,

hier kommt eine wahrscheinlich sehr einfache Frage:
Wie kann ich bei der Erzeugung eines Views den Datentyp einer (aggregierten) Spalte explizit festlegen?

```
create or replace view ...
select 
   abc.ID,
   avg (cde.value) "AVG_value"
from ...
group by ...
```
cde.value ist vom Datentyp "number" (13,6), diesen Typ moechte ich fuer "AVG_value" auch festlegen. Denn anscheind geschieht dies nicht?! Wenn ich den View jedenfalls aus einer anderen Anwendung ueber ODBC hereinlade, hat diese Probleme damit, was am Datentyp liegen muss (sie haelt ihn fuer LONG, normalerweise habe ich jedoch keine Probleme).

Also, danke schon einmal.
Ciao, T.


----------



## vop (4. Oktober 2005)

Vermutlich reserviert Oracle genügend Platz, um avg entsprechend unterbringen zu können.
  Wenn Du allerdings den erhaltenen Wert noc konvertieren würdest, dann würde vermutlich der richtige Datentyp verwendet.

  Versuch mal etwas in der Art


  to_char(cde.value,'9999999.999999') "AVG_VALUE"

 vop


----------



## SQLstruggle (4. Oktober 2005)

Hallo  vop,

ja, das funktioniert, aber aendert am Datentyp leider nichts, der ist immer noch NUMBER statt NUMBER (13,6)   


```
to_number( avg (cde.value,'9999999D999999') ) "AVG_VALUE"
```
Irgend eine andere Idee? Und warum aender Oracle ueberhaupt etwas am Datentyp - das verstehe ich nicht ganz. 
Und es liegt auch nicht an der Anwendung, mein SQL Navigator zeigt mir den Datentyp auch entsprechend an ...


----------



## vop (4. Oktober 2005)

Views haben ja nun nicht wirklich echte Datentypen, da sie ja eigentlich nur etwas Vorweg-arbeit leisten und nicht etwa Tabellen sind.
 Damit bei Funktionen auch alle möglichen Werte passen, beschränkt Oracle vermutlich die Werte nicht so, wie Du es erwartest. Oracle geht etwas pessimistischer an die Sache heran.
 Eigentlich ist das aber auch kein Problem.

 Was stört dich daran?

 vop


----------



## SQLstruggle (4. Oktober 2005)

> Was stört dich daran?


Mich persoenlich gar nichts ... schliesslich werden die Werte im View bei einer Abfage im SQL Navigator auch richtig angezeigt. Meine Anwendung (ArcGIS) aber mag das ueberhaupt nicht. Die haelt eine NUMBER ohne scale/precision fuer einen LONG und entsprechend gehen die Nachkommastellen verloren.

Kann man das nicht irgendwie explizit zuweisen?

Danke aber schon mal fuer die Hilfe.


----------



## vop (5. Oktober 2005)

Keine Ahnung, ob man den Typen verändern kann, würde mich wundern.

 Im Notfall hilft vielleicht ein Workaround:

 Wandle die Zahl mit to_number() in eine Number OHNE Nachkommastellen (zur Not mit 10 hoch 6 multiplizieren)
 Dann darf deine Anwendung ruhig die Nachkommastellen abschneiden (weil keine mehr da sind).
 Du mußt dann entsprechend später den Wert wieder durch 10 hoch 6 teilen und damit die Nachkommastellen wieder herstellen.

 Wie gesagt, keine gute Lösung, würde aber u.U. helfen

 vop


----------



## SQLstruggle (5. Oktober 2005)

Hm, das mag fuer ein "normales" Attribut ja noch funktionieren, bei Koordinaten funktioniert das dann aber nicht - denn beim Einlesen dieser habe ich in meiner Anwendung keine Moeglichkeit, vorher irgend etwas zu multiplizieren.

Aber vielleicht liegt das Problem auch ganz wo anders, habe ich inzwischen gedacht ... Denn in der Oracle DB ist das Dezimaltrennzeichen ein Komma und kein Punkt. Meine Anwendung rechnet aber mit einem Punkt. 

Also: Wie koennte ich in einem View festlegen, dass das Dezimaltrennzeichen als Punkt ausgegeben wird, ohne dabei etwas an den eigentlichen Daten zu veraendern?

ps: 06:46 - nicht schlecht ...


----------



## vop (5. Oktober 2005)

> Also: Wie koennte ich in einem View festlegen, dass das Dezimaltrennzeichen als Punkt ausgegeben wird, ohne dabei etwas an den eigentlichen Daten zu veraendern?


 
 Versuchs noch mal mit to_char() und entsprechend einem Punkt als Dezimaltrenner

 vop

 p.s.
 es war 07:46


----------



## SQLstruggle (5. Oktober 2005)

Das [to_char(), etc.] wuerde die Sache nur noch schlimmer machen, befuerchte ich (meine Anwendung wuede das dann fuer Text halten).

Inzwischen habe ich noch etwas herausgefunden: Der Datentyp aendert sich nur bei der Anwendung einer Aggerierungs-Funktion wie count(), avg(), etc. Aus NUMBER 9/6 wird dann NUMBER. Ansonsten ist der Datentyp im View identisch mit der Originalspalte.

Die Aenderung zu NUMBER ist ein Problem, denn meine Anwendung geht beim Verbinden ueber ODBC wie folgt vor:

ORACLE (Prec/Scale) ArcGIS (Length/Prec/Scale)
Float -> Double (8/0/0)
Number (9/6) -> Double (8/9/6)
Number -> Long (4/38/0)

Aus meiner urspruenglichen Number (9/6) wurde durch avg() eine Number, die nun fuer eine Long gehalten wird ...

Ausserdem sind in meiner Oracle DB die Koordinaten als Number (9/6) gespeichert. Daraus wird dann eine Double (8/9/6). Um die Koordinaten jedoch vernueftig nutzen zu koennen brauche ich den Typ Double (8/0/0). Sprich, wenn ich es schaffen wuerde, aus Number (9/6) einen Float zu machen, duerfte es zumindest fuer die Koordinaten funktionieren. Aber eine to_float Funktion gibt es glaube ich nicht ?! Jedenfalls wuerde ich eine „Konvertierung“ auf der View-Ebene allem anderen den Vorzug geben ...

Ok, vielleicht hast Du ja noch einen Rat?

Danke, T.


----------

