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

Udfyldning af en PL/SQL-tabel fra en blok i Oracle D2k Forms

Population af en PL/SQL-tabel fra en blok i Oracle D2k-formularer

En PL/SQL-tabel kan udfyldes fra en blok ved hjælp af Forms' implicitte udfyldning af indbyggede TABLE_FROM_BLOCK. Denne meget praktiske funktion eliminerer, at du skal gå eksplicit gennem blokken. Følgende procedure illustrerer konceptet:
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;

Følg disse trin for at bruge denne teknik:

  1. Definer en PL/SQL-post, så den svarer til den poststruktur, der skal sendes som input. I dette tilfælde er det state_rec og udgør de to elementer KODE og NAVN svarende til STATE_CODE og STATE_NAME.

  2. Definer PL/SQL-tabellen til at være en tabel med poster af typen defineret i trin 1. I dette tilfælde er det min_tabel.

Bemærk Oracle-dokumentationen definerer PL/SQL-tabellen til at være af typen PLITBLM.TABLE_OF_ANY, men at definere PL/SQL-tabellen på den måde, jeg har beskrevet, fungerer godt.

  1. Definer en variabel af typen ITEMS_IN_BLOCK (en tabel over VARCHAR2 ) og indstil dens individuelle elementer til at være navnene på blokelementnavnene, hvis værdier figurerer som elementer af posttypen defineret i trin 1.

  2. Kald den indbyggede TABLE_OF_ANY med den definerede PL/SQL-tabel, inputbloknavn, startpostnummer, slutpostnummer og variabelen defineret i trin 3 videregivet som parametre.

TipFor at videregive alle posterne i blokken skal du angive 1 som startpostnummer og konstanten ALL_RECORDS som slutrekordnummer.

TABLE_FROM_BLOCK's succes eller fiasko

Succes eller fiasko for TABLE_FROM_BLOCK kan i de fleste tilfælde fanges af FORM_SUCCESS. Der er dog undtagelser. En sådan undtagelse er fejlen FRM-40733:PL/SQL indbygget TABLE_FROM_BLOCK mislykkedes. I dette tilfælde er det ikke en af ​​FORM_SUCCESS, FORM_FAILURE, eller FORM_FATAL. ON-ERROR er ofte et praktisk alternativ til FORM_SUCCESS til sporing af succes eller fiasko for TABLE_FROM_BLOCK og i dette eksempel hjælper det os også med at fange denne fejl. Den foregående fejl opstår, når et ikke-eksisterende bloknavn sendes eller negative værdier sendes for start- eller start- og slutpostpositionerne. Tip Et andet vigtigt punkt at bemærke er, at TABLE_FROM_BLOCK sløjfer implicit gennem blokken, så POST-QUERY udføres for hver post. Det er dog hurtigere end den manuelle looping. For et resultatsæt på 3.300 poster blev det set til at være 3,5 gange hurtigere end den manuelle looping med Oracle 8.0.5, der kører på Windows NT.
  1. sql-sætningsfejl:kolonne .. eksisterer ikke

  2. Hvordan får man numeriske typer fra MySQL ved hjælp af PDO?

  3. SQL-syntaksudtryk for 'WHERE (col1, col2) <(val1, val2)'

  4. Sådan tilføjer du antal dage i postgresql datetime