Oracle
 sql >> Database >  >> RDS >> Oracle

Popolamento di una tabella PL/SQL da un blocco in moduli Oracle D2k

Popolazione di una tabella PL/SQL da un blocco in moduli Oracle D2k

Una tabella PL/SQL può essere popolata da un blocco utilizzando il popolamento implicito di Forms integrato TABLE_FROM_BLOCK. Questa funzione molto utile elimina la necessità di scorrere il blocco in modo esplicito. La procedura seguente illustra il concetto:
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;

Per utilizzare questa tecnica, attenersi alla seguente procedura:

  1. Definire un record PL/SQL equivalente alla struttura del record da passare come input. In questo caso, è state_rec e costituisce i due elementi CODICE e NOME corrispondente a STATE_CODE e STATE_NAME.

  2. Definisci la tabella PL/SQL come una tabella di record del tipo definito nel passaggio 1. In questo caso, è mia_tabella.

NotaLa documentazione Oracle definisce la tabella PL/SQL di tipo PLITBLM.TABLE_OF_ANY, ma la definizione della tabella PL/SQL nel modo che ho descritto funziona bene.

  1. Definisci una variabile di tipo ITEMS_IN_BLOCK (una tabella di VARCHAR2 ) e impostare i suoi singoli elementi in modo che siano i nomi dei nomi degli elementi del blocco i cui valori figurano come elementi del tipo di record definito nel passaggio 1.

  2. Chiama il TABLE_OF_ANY integrato con la tabella PL/SQL definita, il nome del blocco di input, il numero del record iniziale, il numero del record finale e la variabile definita nel passaggio 3 passata come parametri.

SuggerimentoPer passare tutti i record nel blocco, specificare 1 come numero di record iniziale e la costante ALL_RECORDS come numero di record finale.

Il successo o il fallimento di TABLE_FROM_BLOCK

Il successo o il fallimento di TABLE_FROM_BLOCK nella maggior parte dei casi può essere intrappolato da FORM_SUCCESS. Tuttavia, ci sono delle eccezioni. Una di queste eccezioni è l'errore FRM-40733:TABLE_FROM_BLOCK integrato PL/SQL non riuscito. In questo caso, non è uno di FORM_SUCCESS, FORM_FAILURE, o FORM_FATAL. IN ERRORE è spesso una pratica alternativa a FORM_SUCCESS per tenere traccia del successo o del fallimento di TABLE_FROM_BLOCK e anche in questo esempio ci aiuta a intrappolare questo errore. L'errore precedente si verifica quando viene passato un nome di blocco inesistente o vengono passati valori negativi per le posizioni del record iniziale o iniziale e finale. SuggerimentoUn altro punto importante da notare è che TABLE_FROM_BLOCK scorre implicitamente il blocco, quindi POST-QUERY viene eseguito per ogni record. Tuttavia, è più veloce del ciclo manuale. Per un set di risultati di 3.300 record, è risultato essere 3,5 volte più veloce del ciclo manuale con Oracle 8.0.5 in esecuzione su Windows NT.