2011-11-07 9 views
7

w PL/SQL: varray może być zainicjowany w momencie tworzenia jak:Inicjalizacja do pl/sql rekordu typu

TYPE colour_tab IS VARRAY(3) OF VARCHAR2(20); 
    french_colours colour_tab := colour_tab('RED','WHITE','BLUE'); 

Czy jest równoważna metoda inicjalizacji dla typów PL/SQL rekord?

type location_record_type is record (
     street_address  varchar2(40), 
    postal_code   varchar2(12), 
     city     varchar2(30), 
    state_province  varchar2(25), 
    country_id   char(2) not null := 'US' 
    ); 
+0

Jeśli zrobisz ten typ jako obiekt bazy danych, możesz to zrobić. Lub myślę, że musisz, jeśli nie tworzysz funkcji konstruktora do typu obiektu. –

+0

Zobacz moją odpowiedź na http://stackoverflow.com/a/28208606/214728, powinno to działać podobnie do kodów colour_tab: = colour_tab ("RED", "WHITE", "BLUE") –

Odpowiedz

5

Nie, nie ma. Musisz jawnie przypisać każdą wartość. Documentation reference here.

+0

OK, chyba im utknął z robi to ręcznie. :) – ziggy

+0

Wiem, ja też tego nienawidzę ;-) – DCookie

+0

Zobacz moją odpowiedź na http://stackoverflow.com/a/28208606/214728, to powinno działać podobnie do colour_tab: = colour_tab ("RED", "WHITE" , "BLUE") kodowania –

3

Typy rekordów są rzeczywiście przeznaczone do przechowywania wierszy z instrukcji SELECT.

.... 
    type location_record_type is record (
      street_address  varchar2(40), 
     postal_code   varchar2(12), 
      city     varchar2(30), 
     state_province  varchar2(25), 
     country_id   char(2) not null := 'US' 
     ); 
    type location_record_nt is table of location_record_type; 
    loc_recs location_record_nt; 
begin 
    select street_name 
      , pcode 
      , city 
      , region 
      , country_code 
    bulk collect into loc_recs 
    from t69 
    where .... 

Oczywiście w przypadkach, gdy kwerenda nie jest SELECT * FROM jednej tabeli (bo w tym scenariuszu możemy użyć zamiast %ROWTYPE.

6

użyć funkcji działać jako swego rodzaju „konstruktor” funkcja (spójrz na funkcji f()).

DECLARE 
    TYPE ty_emp IS RECORD(
    id INTEGER, 
    name VARCHAR(30), 
    deptcode VARCHAR(10) 
    ); 
    TYPE ty_tbl_emp IS TABLE OF ty_emp; 
    tbl_emp ty_tbl_emp; 
    FUNCTION f (   -- <============== 
    id INTEGER, 
    name VARCHAR, 
    deptcode VARCHAR) RETURN ty_emp IS 
    e ty_emp; 
    BEGIN 
    e.id := id; 
    e.name := name; 
    e.deptcode := deptcode; 
    RETURN e; 
    END f; 
BEGIN 

    tbl_emp := ty_tbl_emp(
    f(1, 'Johnson', 'SALES'), 
    f(2, 'Peterson', 'ADMIN')); 
    Dbms_Output.put_line(tbl_emp(2).name); 
END; 
0

można utworzyć funkcję powrotu że typ rekordu

poniżej przykładowy kod:

DECLARE 
    type location_record_type is record (
     street_address  varchar2(40), 
     postal_code   varchar2(12), 
     city     varchar2(30), 
     state_province  varchar2(25), 
     country_id   char(2) not null := 'US'); 
    v_loc_rec location_record_type; 
    FUNCTION new_loc_rec RETURN location_record_type 
    IS 
     v_new_loc_rec location_record_type; 
    BEGIN 
     return v_new_loc_rec; 
    END; 
BEGIN 
    v_loc_rec := new_loc_rec; 
    v_loc_rec.state_province := 'SomeState'; 
    v_loc_rec.country_id := 'SU'; 
    dbms_output.put_line('State: '||v_loc_rec.state_province||'; Country_ID: '||v_loc_rec.country_id); 
    v_loc_rec := new_loc_rec; 
    dbms_output.put_line('State: '||v_loc_rec.state_province||'; Country_ID: '||v_loc_rec.country_id); 
END; 
0

Oracle 18c umożliwia zapis inicjalizacji z qualified expressions:

declare 
    type location_record_type is record 
    (
     street_address  varchar2(40), 
     postal_code   varchar2(12), 
     city     varchar2(30), 
     state_province  varchar2(25), 
     country_id   char(2) not null := 'US' 
    ); 
    --Oracle 18c Qualified Expression: 
    v_location location_record_type := 
     location_record_type('1234 Fake Street', '90210', 'Springfield', 'KY', 'US'); 
begin 
    dbms_output.put_line('It worked!'); 
end; 
/

można uruchomić powyższy kod przykładowy w Oracle SQL here żywo. (Niestety, ta strona wymaga zalogowania Ponieważ 18c nie jest dostępny do pobrania, nie ma zbyt wielu wygodnych sposobów testowania nowych funkcji.)