Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Preenchendo uma tabela PL/SQL de um bloco no Oracle D2k Forms

Preenchendo uma tabela PL/SQL a partir de um bloco em formulários Oracle D2k

Uma tabela PL/SQL pode ser preenchida a partir de um bloco usando o preenchimento implícito do Forms TABLE_FROM_BLOCK. Esse recurso muito útil elimina a necessidade de percorrer o bloco explicitamente. O procedimento a seguir ilustra o conceito:
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 usar essa técnica, siga estas etapas:

  1. Defina um registro PL/SQL para ser equivalente à estrutura de registro a ser passada como entrada. Neste caso, é state_rec e constitui os dois itens CÓDIGO e NOME correspondente a STATE_CODE e STATE_NAME.

  2. Defina a tabela PL/SQL para ser uma tabela de registros do tipo definido na etapa 1. Nesse caso, é my_table.


ObservaçãoA documentação do Oracle define a tabela PL/SQL para ser do tipo PLITBLM.TABLE_OF_ANY, mas definir a tabela PL/SQL da maneira que descrevi funciona bem.

  1. Defina uma variável do tipo ITEMS_IN_BLOCK (uma tabela de VARCHAR2 ) e defina seus elementos individuais para serem os nomes dos nomes dos itens do bloco cujos valores figuram como elementos do tipo de registro definido na etapa 1.

  2. Chame o TABLE_OF_ANY integrado com a tabela PL/SQL definida, nome do bloco de entrada, número do registro inicial, número do registro final e a variável definida na etapa 3 passada como parâmetros.
DicaPara passar todos os registros no bloco, especifique 1 como o número do registro inicial e a constante ALL_RECORDS como o número do registro final.

O sucesso ou fracasso de TABLE_FROM_BLOCK

O sucesso ou falha de TABLE_FROM_BLOCK pode, na maioria dos casos, ser capturado por FORM_SUCCESS. No entanto, existem exceções. Uma dessas exceções é o erro FRM-40733:PL/SQL interno TABLE_FROM_BLOCK falhou. Neste caso, não é um dos FORM_SUCCESS, FORM_FAILURE, ou FORM_FATAL. EM-ERRO geralmente é uma alternativa útil para FORM_SUCCESS para rastrear o sucesso ou falha de TABLE_FROM_BLOCK e neste exemplo também nos ajuda a capturar esse erro. O erro anterior ocorre quando um nome de bloco inexistente é passado ou valores negativos são passados ​​para as posições de registro inicial ou inicial e final. DicaOutro ponto importante a ser observado é que TABLE_FROM_BLOCK faz um loop implícito pelo bloco, então POST-QUERY é executado para cada registro. No entanto, é mais rápido que o loop manual. Para um conjunto de resultados de 3.300 registros, ele foi considerado 3,5 vezes mais rápido do que o loop manual com o Oracle 8.0.5 em execução no Windows NT.