sql >> Databáze >  >> RDS >> Oracle

Naplnění tabulky PL/SQL z bloku v Oracle D2k Forms

Naplnění tabulky PL/SQL z bloku v Oracle D2k Forms

Tabulku PL/SQL lze naplnit z bloku pomocí vestavěného implicitního plnění ve formulářích TABLE_FROM_BLOCK. Tato velmi užitečná funkce eliminuje nutnost procházet blokem explicitně. Následující postup ilustruje koncept:
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;

Chcete-li použít tuto techniku, postupujte takto:

  1. Definujte záznam PL/SQL tak, aby byl ekvivalentní struktuře záznamu, která má být předána jako vstup. V tomto případě je to state_rec a tvoří dvě položky CODE a NAME odpovídající STATE_CODE a STATE_NAME.

  2. Definujte tabulku PL/SQL jako tabulku záznamů typu definovaného v kroku 1. V tomto případě je to my_table.

PoznámkaDokumentace Oracle definuje tabulku PL/SQL jako typ PLITBLM.TABLE_OF_ANY, ale definování tabulky PL/SQL způsobem, který jsem popsal, funguje dobře.

  1. Definujte proměnnou typu ITEMS_IN_BLOCK (tabulka VARCHAR2 ) a nastavte jeho jednotlivé prvky tak, aby byly názvy názvů položek bloku, jejichž hodnoty figurují jako prvky typu záznamu definovaného v kroku 1.

  2. Zavolejte na vestavěný TABLE_OF_ANY s definovanou PL/SQL tabulkou, názvem vstupního bloku, číslem počátečního záznamu, číslem konce záznamu a proměnnou definovanou v kroku 3 předanými jako parametry.

TipChcete-li předat všechny záznamy v bloku, zadejte 1 jako počáteční číslo záznamu a konstantu ALL_RECORDS jako koncové číslo záznamu.

Úspěch nebo neúspěch TABLE_FROM_BLOCK

Úspěch nebo neúspěch TABLE_FROM_BLOCK může být ve většině případů zachycen pomocí FORM_SUCCESS. Existují však výjimky. Jednou z takových výjimek je chyba FRM-40733:PL/SQL vestavěný TABLE_FROM_BLOCK se nezdařil. V tomto případě to není jeden z FORM_SUCCESS, FORM_FAILURE, nebo FORM_FATAL. CHYBA ZAPNOUT je často šikovnou alternativou k FORM_SUCCESS pro sledování úspěchu nebo neúspěchu TABLE_FROM_BLOCK a v tomto příkladu nám také pomáhá zachytit tuto chybu. K předchozí chybě dochází, když je předán neexistující název bloku nebo jsou předány záporné hodnoty pro počáteční nebo počáteční a koncovou pozici záznamu. TipDalším důležitým bodem, který je třeba poznamenat, je TABLE_FROM_BLOCK implicitně prochází blokem, takže POST-QUERY se provádí pro každý záznam. Je to však rychlejší než ruční smyčka. U výsledné sady 3 300 záznamů bylo zjištěno, že je 3,5krát rychlejší než ruční opakování s Oracle 8.0.5 běžícím na Windows NT.
  1. Jak změnit sekundy na časovou hodnotu v MySQL

  2. Tipy pro opravu fragmentace indexu SQL Server

  3. Existuje nějaký rozdíl mezi DateTime v c# a DateTime na SQL serveru?

  4. Advanced SQL:CROSS APPLY a OUTER APPLY