2009-05-08 3 views
2

Angenommen, ich habe einige Datentypen definiert in PL/SQL:Generika-ähnliches Verhalten in PL/SQL-Prozedur Parameter

TYPE foo_t IS RECORD (...); 
TYPE foo_table_t IS TABLE OF foo_t INDEX BY BINARY_INTEGER; 

TYPE bar_t IS RECORD (...); 
TYPE bar_table_t IS TABLE OF bar_t INDEX BY BINARY_INTEGER; 

Ist es mir möglich, ein Verfahren zu schreiben fähig ist jeden Datentyp aus der Tabelle abgeleitet akzeptieren (zum Beispiel, entweder eine foo_table_t oder eine bar_table_t) als Parameter? Die Prozedur benötigt keine Kenntnis der Zeilentypen der Tabelle. Ein triviales Beispiel:

PROCEDURE remove_last(some_table ...) IS 
BEGIN 
    some_table.DELETE(some_table.LAST); 
END; 

Antwort

4

Nicht direkt. Aus dem PL/SQL-Programmierhandbuch:

"Der tatsächliche Parameter und der entsprechende formale Parameter müssen kompatible Datentypen haben."

PL/SQL führt eine implizite Konvertierung von tatsächlichen Parameterdatentypen in formale Parameterdatentypen durch. Sie könnten also einen Zahlenwert an eine Prozedur übergeben, die eine Zeichenfolge benötigt, und sie würde funktionieren, weil Sie eine implizite Konvertierung durchführen können.

Das Beste, was Sie tun könnten, wäre, zu überladenen Prozeduren schreiben:

VERFAHREN generic (foo IN OUT foo_t);

PROCEDURE generisch (bar IN OUT bar_t);

Dann können Sie generische mit jedem Datensatztyp aufrufen. Dies verliert an Attraktivität im Verhältnis zur Anzahl der zu handhabenden Datensatztypen: -D