Ich arbeite daran, eine bestehende Anwendung von SQL Server auf Oracle zu konvertieren, und ich bin auf ein Hindernis gestoßen. Ich versuche, einen anonymen Block als dynamisches SQL auszuführen und ein Ergebnisset zurückzugeben. Jedoch scheint nichts, was ich versucht habe, in der Lage zu sein, irgendwelche Werte zurückzugeben. Gespeicherte Prozeduren sind aufgrund von Designbeschränkungen ausgeschlossen.
Meine Abfrage ist definiert als:
DECLARE type id_array IS TABLE OF number;
t_Ids id_array;
BEGIN
UPDATE CSM_RECORDS SET MIGRATION_STATE = 1, LAST_UPDATE = CURRENT_DATE
WHERE OBJECT_UID IN
(SELECT OBJECT_UID
FROM CSM_RECORDS obj
WHERE MIGRATION_STATE = 0
AND ROWNUM <= :BatchSize)
AND (:BatchName IS NULL OR obj.BATCH_NAME = :BatchName)
RETURNING OBJECT_UID BULK COLLECT INTO t_Ids;
OPEN rcursor FOR SELECT * FROM CSM_RECORDS;-- WHERE OBJECT_UID IN (t_Ids);
END;
Wie Sie sehen können, habe ich die WHERE-Klausel im Cursor auskommentiert, in einem Versuch, überhaupt etwas zurückzugeben.
Auf der C#-Seite habe ich folgendes:
OracleCommand getNextNodesC = new OracleCommand(SQL_AS_SHOWN_ABOVE, conn);
getNextNodesC.BindByName = true;
OracleParameter batchSizeP = new OracleParameter("BatchSize", OracleDbType.Int32);
batchSizeP.Value = batchSize;
getNextNodesC.Parameters.Add(batchSizeP);
OracleParameter batchNameP = new OracleParameter("BatchName", OracleDbType.Varchar2);
batchNameP.Value = batchName;
getNextNodesC.Parameters.Add(batchNameP);
OracleParameter returnCursor = new OracleParameter("rcursor", OracleDbType.RefCursor);
returnCursor.Direction = ParameterDirection.Output;
getNextNodesC.Parameters.Add(returnCursor);
getNextNodesC.ExecuteNonQuery();
return ((Oracle.ManagedDataAccess.Types.OracleRefCursor)returnCursor.Value).GetDataReader();
Das Endziel ist ein DbDataReader
, den ich verwenden kann, aber im obigen Code scheint der returnCursor.Value
weiterhin null zu bleiben. Ich habe verschiedene Kombinationen von Output
vs. ReturnValue
Parametern und ExecuteNonQuery()
und ExecuteReader()
ausprobiert, leider ohne Erfolg.
Jegliche Hinweise wären willkommen, aber ein Beispielcode, der tatsächlich das erreichen würde, was ich suche, wäre spektakulär.