2011-11-07 41 views
7

在PL/SQL中,varray可以在創建時初始化爲:正在初始化一個PL/SQL記錄類型

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

是否有初始化爲PL/SQL記錄類型等效的方法?

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

如果您將該類型設置爲數據庫對象,那麼您可以這樣做。或者我認爲你必須如果你不創建一個對象類型的構造函數。 –

+0

看到我的回答在http://stackoverflow.com/a/28208606/214728,這應該類似於colour_tab:= colour_tab('RED','WHITE','BLUE')編碼 –

回答

5

不,沒有。您必須明確分配每個值。 Documentation reference here

+0

好吧,我猜我堅持手動做。 :) – ziggy

+0

我知道,我也討厭;-) – DCookie

+0

請參閱我的回答http://stackoverflow.com/a/28208606/214728,這應該類似於colour_tab:= colour_tab('RED','WHITE' ,'藍')編碼 –

3

記錄類型實際上是爲了保存來自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 .... 

顯然,對於該查詢不是SELECT * FROM一個表(因爲在那種情況下,我們可以使用%ROWTYPE代替的情況。

6

使用函數作爲一種「構造」的功能(看看函數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

您可以創建一個返回該記錄類型的函數

請參見下面的示例代碼:

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

甲骨文18C允許記錄初始化與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; 
/

可以在現場的Oracle SQL here運行上面的示例代碼。 (不幸的是,該網站需要登錄。由於18c無法下載,但沒有多種方便的方式來測試新功能。)