Oracle
 sql >> Base de données >  >> RDS >> Oracle

Remplir une table PL/SQL à partir d'un bloc dans Oracle D2k Forms

Remplir une table PL/SQL à partir d'un bloc dans Oracle D2k Forms

Une table PL/SQL peut être remplie à partir d'un bloc à l'aide de la fonction intégrée de remplissage implicite de Forms TABLE_FROM_BLOCK. Cette fonctionnalité très pratique vous évite d'avoir à parcourir explicitement le bloc. La procédure suivante illustre le 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;

Pour utiliser cette technique, suivez ces étapes :

  1. Définissez un enregistrement PL/SQL comme étant équivalent à la structure d'enregistrement à transmettre en entrée. Dans ce cas, il s'agit de state_rec et constitue les deux éléments CODE et NOM correspondant à STATE_CODE et STATE_NAME.

  2. Définissez la table PL/SQL comme étant une table d'enregistrements du type défini à l'étape 1. Dans ce cas, il s'agit de my_table.

RemarqueLa documentation Oracle définit la table PL/SQL comme étant de type PLITBLM.TABLE_OF_ANY, mais définir la table PL/SQL de la manière que j'ai décrite fonctionne bien.

  1. Définir une variable de type ITEMS_IN_BLOCK (une table de VARCHAR2 ) et définissez ses éléments individuels comme étant les noms des éléments de bloc dont les valeurs figurent en tant qu'éléments du type d'enregistrement défini à l'étape 1.

  2. Appelez la TABLE_OF_ANY intégrée avec la table PL/SQL définie, le nom du bloc d'entrée, le numéro d'enregistrement de début, le numéro d'enregistrement de fin et la variable définie à l'étape 3 transmise en tant que paramètres.

AstucePour transmettre tous les enregistrements du bloc, spécifiez 1 comme numéro d'enregistrement de départ et la constante ALL_RECORDS comme numéro d'enregistrement de fin.

Le succès ou l'échec de TABLE_FROM_BLOCK

Le succès ou l'échec de TABLE_FROM_BLOCK peut dans la plupart des cas être piégé par FORM_SUCCESS. Cependant, il existe des exceptions. L'une de ces exceptions est l'erreur FRM-40733 :PL/SQL intégré TABLE_FROM_BLOCK a échoué. Dans ce cas, ce n'est pas l'un des FORM_SUCCESS, FORM_FAILURE, ou FORM_FATAL. EN ERREUR est souvent une alternative pratique à FORM_SUCCESS pour suivre le succès ou l'échec de TABLE_FROM_BLOCK et dans cet exemple, aussi, nous aide à piéger cette erreur. L'erreur précédente se produit lorsqu'un nom de bloc inexistant est transmis ou que des valeurs négatives sont transmises pour les positions d'enregistrement de début ou de début et de fin. AstuceUn autre point important à noter est que TABLE_FROM_BLOCK boucle implicitement sur le bloc, donc POST-QUERY est exécuté pour chaque enregistrement. Cependant, c'est plus rapide que la boucle manuelle. Pour un ensemble de résultats de 3 300 enregistrements, il s'est avéré 3,5 fois plus rapide que la boucle manuelle avec Oracle 8.0.5 exécuté sur Windows NT.