2017-12-07 3 views
0

Ich habe die folgende Abfrage in dem Verfahren eingebettet P_GET_TABLE1:Warum verursacht der UNION-Operator eine Änderung des Datentyps in OracleDataAdapter?

SELECT 
    t1.field1 XXXX 
FROM table1 t1 

field1 ist NUMBER(12). Die Prozedur wird in einem .NET-Code unter Verwendung von OracleDataAdapter ausgeführt und füllt eine DataTable, so dass XXXX in eine long konvertiert wird.

Ich habe ein anderes Verfahren P_GET_TABLE2:

SELECT 
    t1.field1 XXXX 
FROM table1 t1 
UNION 
SELECT 
    0 as XXXX 
FROM table2 

Die Vereinigung scheint jedoch eine Änderung des Datentyps zu bewirken, so dass XXXX nicht auf eine long, decimal nur umgewandelt werden.

Meine Fragen sind:

  • Warum ein UNION Operator die OracleDataAdapter bewirkt, dass der Datentyp zu ändern?
  • Kann ich die OracleDataAdapter zwingen XXXX als long

Speziell zu interpretieren, wird dieser Code verwendet, um Daten zu erhalten:

OracleDataAdapter da = new OracleDataAdapter(); 
da.SelectCommand = cmd; 
DataTable dt = new DataTable(); 
da.Fill(dt); 
foreach(DataRow row in da.Rows) 
{ 
    long value = (long)row["XXXX"]; // works when P_GET_TABLE1; exception when P_GET_TABLE2 is used; 
} 

Die Ausnahme: 'Object of type 'System.Decimal' cannot be converted to type 'System.Int64'.'

+0

In Oracle-Datentypen anders als das, was man normalerweise erwarten würde auf Oracle Datatypes eine Google-Suche tun, und es wird den Unterschied in Bezug auf Int Decimals Nummer usw. erklären .. – MethodMan

+0

Was Sie von 'select-Dump erhalten tun (XXXX, 1016) aus (SELECT t1.field1 XXXX FROM table1 t1 UNION SELECT 0 als XXXX vON table2)' –

+0

ich vor ähnliches Problem gesehen habe. Die Lösung besteht darin, das Feld in allen SELECTs explizit in eine CAST-Funktion einzufügen. – OldProgrammer

Antwort

2

diese Jagd down für dich:

Die Dokumentation für Set-Operationen (einschließlich UNION) Links zu den allgemeineren Dokumentationsabschnitt für „implizite Datenkonvertierung“ - wo wir lesen:

Wenn numerische Werte zu manipulieren, Oracle in der Regel Genauigkeit und Maßstab für maximal ermöglichen einstellt Kapazität. In solchen Fällen kann der numerische Datentyp, der sich aus solchen Operationen ergibt, vom numerischen Datentyp in den zugrunde liegenden Tabellen abweichen.

In Ihrem Beispiel, der zweite Zweig der UNION erzeugt den Wert 0, nicht explizit auf irgendeine Genauigkeit und Skalierung gegossen. Standardmäßig wird 0 als Typ NUMBER betrachtet (der eine Genauigkeit von 38 und eine unbestimmte Skalierung hat). Bei UNION ist der Datentyp die "maximale Kapazität", also NUMBER.

Die Lösung ist 0 in CAST einzuwickeln: cast(0 as number(12)) ....

Verwandte Themen