Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wypełnianie tabeli PL/SQL z bloku w Oracle D2k Forms

Wypełnianie tabeli PL/SQL z bloku w Oracle D2k Forms

Tablica PL/SQL może być wypełniona z bloku przy użyciu wbudowanego wypełniania Forms'niejawnego TABLE_FROM_BLOCK. Ta bardzo przydatna funkcja eliminuje konieczność jawnego przechodzenia przez blok. Poniższa procedura ilustruje tę koncepcję:
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;

Aby skorzystać z tej techniki, wykonaj następujące kroki:

  1. Zdefiniuj rekord PL/SQL jako odpowiednik struktury rekordu, który ma być przekazany jako dane wejściowe. W tym przypadku jest to state_rec i stanowi dwa elementy KOD i NAZWA odpowiadający STATE_CODE i STATE_NAME.

  2. Zdefiniuj tabelę PL/SQL jako tabelę rekordów typu zdefiniowanego w kroku 1. W tym przypadku jest to my_table.

Uwaga Dokumentacja Oracle definiuje tabelę PL/SQL jako typu PLITBLM.TABLE_OF_ANY, ale zdefiniowanie tabeli PL/SQL w sposób, który opisałem, działa dobrze.

  1. Zdefiniuj zmienną typu ITEMS_IN_BLOCK (tabela VARCHAR2 ) i ustawić poszczególne jego elementy na nazwy nazw pozycji bloku, których wartości są elementami typu rekordu zdefiniowanego w kroku 1.

  2. Wywołaj wbudowaną TABLE_OF_ANY ze zdefiniowaną tabelą PL/SQL, nazwą bloku wejściowego, numerem początkowym rekordu, numerem końcowym rekordu oraz zmienną zdefiniowaną w kroku 3 przekazanymi jako parametry.

WskazówkaAby przekazać wszystkie rekordy w bloku, podaj 1 jako numer rekordu początkowego i stałą ALL_RECORDS jako końcowy numer rekordu.

Sukces lub porażka TABLE_FROM_BLOCK

Sukces lub porażka TABLE_FROM_BLOCK w większości przypadków może być uwięziony przez FORM_SUCCESS. Są jednak wyjątki. Jednym z takich wyjątków jest błąd FRM-40733:Wbudowana funkcja TABLE_FROM_BLOCK PL/SQL nie powiodła się. W tym przypadku nie jest to jeden z FORM_SUCCESS, FORM_FAILURE, lub FORM_FATAL. W PRZYPADKU BŁĘDU jest często wygodną alternatywą dla FORM_SUCCESS do śledzenia sukcesu lub niepowodzenia TABLE_FROM_BLOCK i w tym przykładzie również pomaga nam w uchwyceniu tego błędu. Powyższy błąd występuje w przypadku przekazania nieistniejącej nazwy bloku lub przekazania wartości ujemnych dla początkowej lub początkowej i końcowej pozycji rekordu. Wskazówka Innym ważnym punktem, na który należy zwrócić uwagę, jest to, że TABLE_FROM_BLOCK niejawnie przechodzi przez blok, więc POST-QUERY jest wykonywany dla każdego rekordu. Jest to jednak szybsze niż ręczne zapętlanie. W przypadku zestawu wyników zawierającego 3300 rekordów okazało się, że jest 3,5 raza szybsze niż ręczne zapętlanie w Oracle 8.0.5 działającym w systemie Windows NT.
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd:PLS-00428:w tej instrukcji oczekiwana jest klauzula into

  2. Mentor Oracle DBA

  3. Funkcja Oracle NULLIF()

  4. GATHER_PLAN_STATISTICS nie generuje podstawowych statystyk planu

  5. Automatyczne generowanie kluczy hibernacji za pomocą MySQL i Oracle