Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Füllen einer PL/SQL-Tabelle aus einem Block in Oracle D2k-Formularen

Befüllen einer PL/SQL-Tabelle aus einem Block in Oracle D2k-Formularen

Eine PL/SQL-Tabelle kann aus einem Block gefüllt werden, indem das implizite Füllen von TABLE_FROM_BLOCK. von Forms verwendet wird Diese sehr praktische Funktion macht es überflüssig, den Block explizit zu durchlaufen. Das folgende Verfahren veranschaulicht das Konzept:
PROCEDURE populate_plsql_table(my_table1 my_table, cnt OUT NUMBER)

IS



/* Define a PL/SQL record with two fields code and name */



TYPE state_rec IS RECORD (code varhcar2(2), name varhcar2(30));



/* Define a PL/SQL table of the record defined above */



TYPE my_table IS TABLE OF state_rec INDEX BY BINARY_INTEGER;

my_table1 my_table;



/* Define a variable of type ITEMS_IN_BLOCK. ITEMS_IN_BLOCK is a

Forms-defined table */

Item_data ITEMS_IN_BLOCK;

Cnt NUMBER;

BEGIN

Item_data(1) := 'STATE_CODE';

item_data(2) := 'STATE_NAME';



/* The call to the Forms built-in TABLE_FROM_BLOCK retrieves the records

from the block and populates the my_table1 table of records */



TABLE_FROM_BLOCK(my_table1, 'STATE',1, ALL_RECORDS, item_data);

-- The SUCCESS or FAILURE of this built-in can be assessed

-- with FORM_SUCCESS, just like any other built-in



IF NOT FORM_SUCCESS THEN

RAISE FORM_TRIGGER_FAILURE;

END IF;

Cnt := my_table1.COUNT;

END populate_plsql_table;

Gehen Sie folgendermaßen vor, um diese Technik zu verwenden:

  1. Definieren Sie einen PL/SQL-Datensatz so, dass er der Datensatzstruktur entspricht, die als Eingabe übergeben werden soll. In diesem Fall ist es state_rec und bildet die beiden Elemente CODE und NAME entspricht STATE_CODE und STATE_NAME.

  2. Definieren Sie die PL/SQL-Tabelle als eine Tabelle mit Datensätzen des in Schritt 1 definierten Typs. In diesem Fall ist es my_table.

AnmerkungDie Oracle-Dokumentation definiert die PL/SQL-Tabelle als vom Typ PLITBLM.TABLE_OF_ANY, aber die Definition der PL/SQL-Tabelle auf die von mir beschriebene Weise funktioniert gut.

  1. Definieren Sie eine Variable vom Typ ITEMS_IN_BLOCK (eine Tabelle von VARCHAR2 ) und setzen Sie seine einzelnen Elemente auf die Namen der Blockelementnamen, deren Werte als Elemente des in Schritt 1 definierten Datensatztyps dargestellt werden.

  2. Rufen Sie das eingebaute TABLE_OF_ANY auf wobei die definierte PL/SQL-Tabelle, der Name des Eingabeblocks, die Startdatensatznummer, die Enddatensatznummer und die in Schritt 3 definierte Variable als Parameter übergeben werden.

TippUm alle Datensätze im Block zu übergeben, geben Sie 1 als Startnummer des Datensatzes und die Konstante ALL_RECORDS an als Endsatznummer.

Der Erfolg oder Misserfolg von TABLE_FROM_BLOCK

Der Erfolg oder Misserfolg von TABLE_FROM_BLOCK kann in den meisten Fällen durch FORM_SUCCESS. abgefangen werden Es gibt jedoch Ausnahmen. Eine solche Ausnahme ist der Fehler FRM-40733:PL/SQL built-in TABLE_FROM_BLOCK failed. In diesem Fall ist es keines von FORM_SUCCESS, FORM_FAILURE, oder FORM_FATAL. FEHLER ist oft eine praktische Alternative zu FORM_SUCCESS um den Erfolg oder Misserfolg von TABLE_FROM_BLOCK zu verfolgen und hilft uns auch in diesem Beispiel, diesen Fehler einzufangen. Der vorstehende Fehler tritt auf, wenn ein nicht vorhandener Blockname übergeben wird oder negative Werte für die Anfangs- oder Anfangs- und Enddatensatzpositionen übergeben werden. TippEin weiterer wichtiger Punkt ist, dass TABLE_FROM_BLOCK durchläuft implizit den Block, also POST-QUERY wird für jeden Datensatz ausgeführt. Es ist jedoch schneller als die manuelle Schleife. Bei einer Ergebnismenge von 3.300 Datensätzen war dies 3,5-mal schneller als die manuelle Schleife mit Oracle 8.0.5 unter Windows NT.