[Oracle] Rowset aus Stored Procedure?

Hallo!

Ich möchte aus einer PL/SQL Stored Procedure ein Rowset/ResultSet/Recordset oder wie man es auch nennen möchte zurückgeben (also kein Return und keinen Out-Parameter).

Ich hab schon von mehreren Leuten gehört, _dass_ es geht, aber keiner weiß genau wie.

Weiß es jemand von euch? :o)

Grüße, Robert

ich arbeite jetzt schon seit mehreren jahren mit oracle
(allerdings nur oracle 7.x) und hab noch nie von der rück-
gabe eines „recordset“ gehört. ich nehme mal an, du willst
einfach mehrere datensätze auf einmal retourgeben. verwende
doch einfach einen varchar als out-parameter, in den du die
werte der zurückzugebenden zeilen reinschreibst (z.b. als
xml-dokument). was anderes fällt mir dazu nicht ein, lasse
mich aber gern eines besseren belehren…

verwende
doch einfach einen varchar als out-parameter, in den du die
werte der zurückzugebenden zeilen reinschreibst

Wäre natürlich eine Möglichkeit. Die Sache ist die, dass das in einem Programm verwendet werden soll, das im Moment nur eben ResultSets (JDBC-Bezeichnung) und „einfache“ Out-Parameter verarbeiten kann, und ich halt möglichst wenig modifizieren möchte.

Wenn wir es hinkriegen, poste ich es … :o)

Grüße, Robert

Hi Robert,
das geht, und zwar mit einem Ref-Cursor als Rückgabewert. Ich bin momentan im Urlaub, aber ab Montag kann ich Dir Genaueres sagen.

Gruß

J.

das geht, und zwar mit einem Ref-Cursor als Rückgabewert. Ich
bin momentan im Urlaub, aber ab Montag kann ich Dir Genaueres
sagen.

Danke, wäre super.

Grüße, Robert

Hi,
ich hab hier ein kleines Beispiel. Dazu habe ich eine Minitabelle samt Inhalt erstellt (Inhalt ist egal):

Oracle8 Enterprise Edition Release 8.0.4.3.1 - Production
With the Partitioning and Objects options
PL/SQL Release 8.0.4.3.1 - Production
create table tabtest( name varchar2(20), zahl number);
insert into tabtest values ('Jan', 3);
insert into tabtest values ('Peter', 24);
insert into tabtest values ('Kalle', 17);
commit;

Dazu habe ich eine kleine Package erstellt, die den Inhalt der Tabelle ausliest und zurückgibt.
Sie hat zwei Funktionen: die eine gibt einen Ref-Cursor zurück, die andere eine PL/SQL-Tabelle.
Ich hoffe, das reicht Dir, wenn nicht, kannst Du mich gern fragen.

create or replace package QueryTabtest as
 -- Zuerst einen Recordtypen definieren, als Beispiel meine Tabelle:
 type r\_tabtest is record (rName tabtest.name%type, rZahl tabtest.zahl%type);
 -- Dann einen Ref-Cursor definieren, der einen Record wie oben definiert zurückgibt:
 type refc\_tabtest is ref cursor return r\_tabtest;
 -- Dann einen Tabellentyp definieren (Achtung, keine DB-Tabelle sondern eine PL/SQL-Table!):
 type tab\_tabtest is table of r\_tabtest index by binary\_integer;
 -- Zwei Prozeduren für Select: die eine über Cursor, die andere über PL/SQL-Tabelle
 procedure SelectCursor(pTabtestCursor IN OUT refc\_tabtest, pWhereClause IN VARCHAR2);
 procedure SelectTable(pTabtestTable IN OUT tab\_tabtest, pWhereClause IN VARCHAR2);
end QueryTabtest;
/

create or replace package body QueryTabtest as
 procedure SelectCursor(pTabtestCursor IN OUT refc\_tabtest, pWhereClause IN VARCHAR2) IS
 vWhereClause varchar2(80) := nvl(pWhereClause, '%'); 
 begin
 open pTabtestCursor for
 select Name, zahl
 from tabtest
 where Name like vWhereClause
 order by zahl;
 end;

 procedure SelectTable(pTabtestTable IN OUT tab\_tabtest, pWhereClause IN VARCHAR2) IS
 vWhereClause varchar2(80) := nvl(pWhereClause, '%'); 
 n number := 1;
 Cursor TabtestCur is 
 Select Name, Zahl
 from tabtest
 where Name like vWhereClause
 order by zahl;
 begin
 open TabtestCur;
 loop
 fetch TabtestCur into pTabtestTable(n).rName, pTabtestTable(n).rZahl;
 exit when TabtestCur%NOTFOUND;
 n := n + 1;
 end loop;
 end;
end QueryTabtest;
/

Gruß

J.

Danke, klappt gut.

Einziger Wermutstropfen ist, dass ich das ResultSet in Java nicht über die Standard-JDBC-Methoden holen kann sondern eigene Klassen von Oracle benötige (und das Programm sollte eigentlich allgemein arbeiten), aber was solls, eh nur ein weiterer Schalter der alles unübersichtlicher macht. :o)

Grüße, Robert

Hui- wußte nicht, daß es für Java ist.
Als Java-Neuling interessiert mich das sehr - kannst Du mir ein Beispiel zumailen (da es jetzt nicht mehr zu Datenbanken paßt)?

Gruß

J.

Danke, klappt gut.::Einziger Wermutstropfen ist, dass ich das ResultSet in Java:nicht über die Standard-JDBC-Methoden holen kann sondern:eigene Klassen von Oracle benötigeIrrtum, es gibt im Package java.sql das Interface ResultSet (sieheAPI Doku JDK 1.2 JDBC 2.0). Damit lassen sich ResultSets auch ohneOracle Extensions verarbeiten.Tom