2 Stimmen

Sind Pakete die einzige Möglichkeit, Daten aus einer Oracle-Datenbank zurückzugeben?

Ich habe bisher hauptsächlich mit SQL Server gearbeitet und wechsle jetzt für ein neues Projekt zu Oracle.

Ich versuche, eine proc zu erstellen, die Daten an eine .net app zurückgeben wird. Die einzige Möglichkeit, wie ich dies zum Funktionieren bekam, ist durch die Verwendung von Paketen wie diese:

CREATE OR REPLACE PACKAGE GetAllDepartments AS
TYPE T_CURSOR IS REF CURSOR;
PROCEDURE p_GetAllDepartments
(
    cur_Result OUT T_CURSOR
);
END GetAllDepartments;

CREATE OR REPLACE PACKAGE BODY GetAllDepartments AS
PROCEDURE p_GetAllDepartments
(
    cur_Result OUT T_CURSOR
)
IS
BEGIN
    OPEN cur_Result FOR
    SELECT * FROM DEPARTMENTS;

END p_GetAllDepartments;
END GetAllDepartments;

Ist dies der einzige Weg, um mit Oracle zu gehen, kann ich nicht einfach die Proc erstellen und diese direkt aufrufen? Danke

4voto

Justin Cave Punkte 220606

Unter der Voraussetzung, dass Sie eine unterstützte Version von Oracle haben, sollten Sie in der Lage sein, etwas wie folgt zu tun

CREATE OR REPLACE PROCEDURE get_all_departments( p_result OUT SYS_REFCURSOR )
AS
BEGIN
  OPEN p_result
   FOR SELECT *
         FROM departments;
END get_all_departments;

Aus organisatorischer Sicht ist es normalerweise besser, Pakete zu verwenden, um Prozeduren zu sammeln, die verwandte Aufgaben erfüllen. In Ihrem Fall wäre es zum Beispiel sinnvoll, ein Paket zu haben, das alle Prozeduren enthält, die sich mit Abteilungen befassen (d.h. create_department , delete_department , usw.).

Und vom allgemeinen stilistischen Standpunkt aus gesehen ist es in Oracle üblicher, eine Ansicht zu erstellen, die die Logik implementiert, die Sie in die gespeicherte Prozedur einfügen würden, und diese Ansicht abzufragen, als eine gespeicherte Prozedur zu erstellen, die nur eine Abfrage durchführt.

1voto

a_horse_with_no_name Punkte 489934

Sie können dies auch ohne ein Paket tun, indem Sie z. B. eine Funktion erstellen, die Ergebnismengen zurückgibt.

Diese Funktionen können wie Tabellen verwendet werden, z.B.: SELECT * FROM my_function()

Dies ist besonders effizient bei Pipeline-Funktionen, da das Ergebnis nicht auf dem Server gepuffert wird, sondern Zeile für Zeile an den Client gesendet wird:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_packages.htm#i1008519

Die grundlegende Technik ist jedoch immer noch dieselbe, d. h. Sie müssen einen Typ definieren, der für den Rückgabetyp der Funktion verwendet wird. Sie können keine "anonyme" Ergebnismenge wie in PostgreSQL oder SQL Server zurückgeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X