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 dieOracleDataAdapter
bewirkt, dass der Datentyp zu ändern? - Kann ich die
OracleDataAdapter
zwingenXXXX
alslong
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'.'
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
Was Sie von 'select-Dump erhalten tun (XXXX, 1016) aus (SELECT t1.field1 XXXX FROM table1 t1 UNION SELECT 0 als XXXX vON table2)' –
ich vor ähnliches Problem gesehen habe. Die Lösung besteht darin, das Feld in allen SELECTs explizit in eine CAST-Funktion einzufügen. – OldProgrammer