sql >> Databasteknik >  >> RDS >> Oracle

Fylla i en PL/SQL-tabell från ett block i Oracle D2k Forms

Fylla en PL/SQL-tabell från ett block i Oracle D2k-formulär

En PL/SQL-tabell kan fyllas i från ett block med hjälp av Forms implicita ifyllning inbyggda TABLE_FROM_BLOCK. Denna mycket praktiska funktion eliminerar att du måste gå igenom blocket explicit. Följande procedur illustrerar 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ör att använda denna teknik, följ dessa steg:

  1. Definiera en PL/SQL-post så att den motsvarar poststrukturen som ska skickas som indata. I det här fallet är det state_rec och utgör de två objekten KOD och NAMN motsvarande STATE_CODE och STATE_NAME.

  2. Definiera PL/SQL-tabellen som en tabell med poster av den typ som definierades i steg 1. I det här fallet är det min_tabell.

Obs! Oracle-dokumentationen definierar PL/SQL-tabellen till att vara av typen PLITBLM.TABLE_OF_ANY, men att definiera PL/SQL-tabellen på det sätt jag har beskrivit fungerar bra.

  1. Definiera en variabel av typen ITEMS_IN_BLOCK (en tabell över VARCHAR2 ) och ställ in dess individuella element som namnen på blockobjektnamnen vars värden är element av posttypen som definieras i steg 1.

  2. Ring den inbyggda TABLE_OF_ANY med den definierade PL/SQL-tabellen, inmatningsblocknamn, startpostnummer, slutpostnummer och variabeln definierad i steg 3 skickas som parametrar.

TipsFör att skicka alla poster i blocket, ange 1 som startpostnummer och konstanten ALL_RECORDS som slutpostnummer.

Framgången eller misslyckandet med TABLE_FROM_BLOCK

Framgång eller misslyckande för TABLE_FROM_BLOCK kan i de flesta fall fångas av FORM_SUCCESS. Det finns dock undantag. Ett sådant undantag är felet FRM-40733:PL/SQL inbyggda TABLE_FROM_BLOCK misslyckades. I det här fallet är det inte en av FORM_SUCCESS, FORM_FAILURE, eller FORM_FATAL. PÅ FEL är ofta ett praktiskt alternativ till FORM_SUCCESS för att spåra framgång eller misslyckande för TABLE_FROM_BLOCK och i det här exemplet hjälper det oss också att fånga detta fel. Det föregående felet uppstår när ett obefintligt blocknamn skickas eller negativa värden skickas för start- eller start- och slutpostpositionerna. Tips En annan viktig punkt att notera är att TABLE_FROM_BLOCK går implicit genom blocket, så POST-QUERY exekveras för varje post. Det är dock snabbare än manuell looping. För en resultatuppsättning på 3 300 poster sågs det vara 3,5 gånger snabbare än den manuella looping med Oracle 8.0.5 som kördes på Windows NT.
  1. Hur man använder samma schema för flera SQL Server-agentjobb (T-SQL)

  2. Råd om att använda pivottabellen i Oracle

  3. Vad är skillnaden mellan =null och IS NULL?

  4. Sammansättning av stacken - Förenkla Docker-distributionen av MySQL-behållare