PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PL/SQL: Tabelle als Inputparamter einer PL/SQL-Funktion



Christian@KA
20-07-2006, 14:11
Hi,

folgendes Problem: Ich hätte gerne eine PL/SQL Funktion, die eine normale Datenbanktabelle als Inputparameter bekommt, mit der was ganz tolles macht und als Ergebnis wieder eine Tabelle zurückliefert. Etwa in der Art:

CREATE OR REPLACE FUNCTION test (inputTable TABLE) RETURN TABLE AS
BEGIN
outputTable = doSomethinWith(inputTable);
RETURN outputTable;
END;
/

damit ich dann später SQL-Aufrufe, wie z.B.:

SELECT * FROM test(db_relation_name);

absetzen kann. "inputTable" und "outputTable" haben dabei nicht das gleiche Schema.
Ich hab ein wenig rumgegoogelt und bin jetzt soweit, dass es wohl so direkt wie oben angedeutet nicht funktionieren wird.

Frage1: Geht es doch in einer ähnlichen Weise?

Frage2: Gibt es einen cleveren Workaround für mein Problem?


Schonmal besten Dank im Voraus,

Christian

Waxolunist
21-07-2006, 09:55
Du musst einen Array erzeugen.

Ungefähr so


create or replace TYPE EXAMPLE_T AS TABLE OF number(19);

create or replace TYPE EXAMPLE2_T AS TABLE OF number(19);

So definierst du eine Table die du übergeben kannst. Ob das mit rowtype auch funktioniert weiß ich nicht.

Das würde dann im Aufruf so aussehen



CREATE OR REPLACE FUNCTION test (inputTable EXAMPLE_T) RETURN EXAMPLE2_T AS

outputTable EXAMPLE2_T;

BEGIN
outputTable = doSomethinWith(inputTable);
RETURN outputTable;
END;

Christian@KA
24-07-2006, 17:04
[...] Ob das mit rowtype auch funktioniert weiß ich nicht. [...]



Hi,

genau das ist ja quasi mein Problem: Ich weiß zur Laufzeit nicht, wie das Schema der Tabelle aussieht, die ich übergeben möchte. Ich stecke in PL/SQL leider nicht so weit drinne, dass ich sagen könnte
a) es geht definitiv nicht oder
b) ich kenne den geeigneten Workaround nicht.

Trotzdem besten Dank für dein Antwort. Ich werde auf jeden Fall noch etwas dranbleiben.


Viele Grüße,

Christian

Waxolunist
24-07-2006, 17:32
Habe jetzt noch einmal dein erstes Post gelesen:

So einen Aufruf von select from table-object habe ich noch nicht gesehen. Hast du schon mal so einen Aufruf versucht. Definierst du hier im declare-Bereich ein Objekt table?

Naja, was ich glaube ist, dass du eine Art dynamic sql suchst, á la



execute immediate 'select 1 from ' || p_table || ' where ' || p_wherestr || ' and rownum=1' into v_count;


p_table ist ein varchar2 typ mit dem namen der table. Ich glaube wenn du hier mit varchars arbeitest, wirst du eher zum Erfolg kommen.

Weil ich glaube tables gibt es wirklich nicht als Übergabeparameter. Aber es gibt Types vom Type Table aber eben keine Tables. (Den Satz wollte ich nur ausschreiben weil er so lustig klingt.)

mfg, Christian