sql >> Base de Datos >  >> RDS >> Oracle

Llenar una tabla PL/SQL desde un bloque en Oracle D2k Forms

Cómo llenar una tabla PL/SQL desde un bloque en Oracle D2k Forms

Una tabla PL/SQL se puede llenar desde un bloque utilizando Forms'implicit populating incorporado TABLE_FROM_BLOCK. Esta característica muy útil elimina la necesidad de recorrer el bloque explícitamente. El siguiente procedimiento ilustra el concepto:
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;

Para utilizar esta técnica, siga estos pasos:

  1. Defina un registro PL/SQL para que sea equivalente a la estructura del registro que se pasará como entrada. En este caso, es state_rec y constituye los dos elementos CODE y NOMBRE correspondiente a CÓDIGO_ESTADO y NOMBRE_ESTADO.

  2. Defina la tabla PL/SQL para que sea una tabla de registros del tipo definido en el paso 1. En este caso, es my_table.

NotaLa documentación de Oracle define que la tabla PL/SQL sea del tipo PLITBLM.TABLE_OF_ANY, pero definir la tabla PL/SQL de la manera que he descrito funciona bien.

  1. Defina una variable de tipo ITEMS_IN_BLOCK (una tabla de VARCHAR2 ) y establezca sus elementos individuales para que sean los nombres de los elementos del bloque cuyos valores figuran como elementos del tipo de registro definido en el paso 1.

  2. Llama al TABLE_OF_ANY incorporado con la tabla PL/SQL definida, el nombre del bloque de entrada, el número de registro inicial, el número de registro final y la variable definida en el paso 3 pasados ​​como parámetros.

ConsejoPara pasar todos los registros en el bloque, especifique 1 como el número de registro inicial y la constante ALL_RECORDS como número de registro final.

El éxito o fracaso de TABLE_FROM_BLOCK

El éxito o fracaso de TABLE_FROM_BLOCK en la mayoría de los casos puede ser atrapado por FORM_SUCCESS. Sin embargo, hay excepciones. Una de esas excepciones es el error FRM-40733:PL/SQL incorporado TABLE_FROM_BLOCK falló. En este caso, no es uno de FORM_SUCCESS, FORM_FAILURE, o FORM_FATAL. EN ERROR suele ser una alternativa práctica a FORM_SUCCESS para rastrear el éxito o el fracaso de TABLE_FROM_BLOCK y en este ejemplo, también, nos ayuda a atrapar este error. El error anterior ocurre cuando se pasa un nombre de bloque inexistente o se pasan valores negativos para las posiciones de registro inicial o inicial y final. ConsejoOtro punto importante a tener en cuenta es que TABLE_FROM_BLOCK implícitamente recorre el bloque, por lo que POST-QUERY se ejecuta para cada registro. Sin embargo, es más rápido que el bucle manual. Para un conjunto de resultados de 3300 registros, se vio que era 3,5 veces más rápido que el bucle manual con Oracle 8.0.5 ejecutándose en Windows NT.