sql >> Database >  >> RDS >> Oracle

Een PL/SQL-tabel vullen vanuit een blok in Oracle D2k Forms

Een PL/SQL-tabel vullen vanuit een blok in Oracle D2k-formulieren

Een PL/SQL-tabel kan worden gevuld vanuit een blok met behulp van Forms'impliciete ingebouwde TABLE_FROM_BLOCK. Deze zeer handige functie elimineert dat u expliciet door het blok hoeft te lopen. De volgende procedure illustreert het concept:
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;

Volg deze stappen om deze techniek te gebruiken:

  1. Definieer een PL/SQL-record als equivalent aan de recordstructuur die als invoer moet worden doorgegeven. In dit geval is het state_rec en vormt de twee items CODE en NAAM komt overeen met STATE_CODE en STATE_NAME.

  2. Definieer de PL/SQL-tabel als een tabel met records van het type gedefinieerd in stap 1. In dit geval is het my_table.

OpmerkingDe Oracle-documentatie definieert de PL/SQL-tabel als van het type PLITBLM.TABLE_OF_ANY, maar het definiëren van de PL/SQL-tabel op de manier die ik heb beschreven, werkt goed.

  1. Definieer een variabele van het type ITEMS_IN_BLOCK (een tabel van VARCHAR2 ) en stel de afzonderlijke elementen in als de namen van de namen van blokitems waarvan de waarden worden weergegeven als elementen van het recordtype dat is gedefinieerd in stap 1.

  2. Bel de ingebouwde TABLE_OF_ANY met de gedefinieerde PL/SQL-tabel, invoerbloknaam, startrecordnummer, eindrecordnummer en de variabele gedefinieerd in stap 3 doorgegeven als parameters.

TipOm alle records in het blok door te geven, specificeert u 1 als het startrecordnummer en de constante ALL_RECORDS als het eindrecordnummer.

Het succes of de mislukking van TABLE_FROM_BLOCK

Het succes of de mislukking van TABLE_FROM_BLOCK kan in de meeste gevallen worden opgesloten door FORM_SUCCESS. Er zijn echter uitzonderingen. Een dergelijke uitzondering is de fout FRM-40733:PL/SQL ingebouwde TABLE_FROM_BLOCK mislukt. In dit geval is het niet een van FORM_SUCCESS, FORM_FAILURE, of FORM_FATAL. ON-FOUT is vaak een handig alternatief voor FORM_SUCCESS voor het volgen van het succes of falen van TABLE_FROM_BLOCK en ook in dit voorbeeld helpt het ons om deze fout op te vangen. De voorgaande fout treedt op wanneer een niet-bestaande bloknaam wordt doorgegeven of negatieve waarden worden doorgegeven voor de begin- of begin- en eindrecordposities. TipEen ander belangrijk punt om op te merken is dat TABLE_FROM_BLOCK loopt impliciet door het blok, dus POST-QUERY wordt uitgevoerd voor elk record. Het is echter sneller dan de handmatige looping. Voor een resultaatset van 3.300 records bleek het 3,5 keer sneller te zijn dan de handmatige looping met Oracle 8.0.5 op Windows NT.
  1. PL/SQL-programma om de records uit de tabel te verwijderen

  2. Hiërarchische queries in MySQL

  3. gebruik een variabele voor tabelnaam in mysql sproc

  4. Voer uitgestelde trigger slechts één keer per rij uit in PostgreSQL