2011-11-07 27 views
7

Trong PL/SQL, một varray có thể được khởi tạo vào thời điểm sáng tạo như:Initialising loại hồ sơ pl/sql

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

Có một phương pháp tương đương với khởi động với nhiều loại kỷ lục 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

Nếu bạn đặt loại đó làm đối tượng cơ sở dữ liệu thì bạn có thể làm điều đó. Hoặc tôi nghĩ rằng bạn phải nếu bạn không tạo ra một hàm xây dựng cho kiểu đối tượng. –

+0

Xem câu trả lời của tôi tại http://stackoverflow.com/a/28208606/214728, điều này sẽ hoạt động tương tự như colour_tab: = colour_tab (mã 'RED', 'WHITE', 'BLUE') –

Trả lời

5

Không, không có. Bạn phải chỉ định từng giá trị một cách rõ ràng. Documentation reference here.

+0

Ok tôi đoán là bị kẹt với làm theo cách thủ công. :) – ziggy

+0

Tôi biết, tôi cũng ghét điều đó ;-) – DCookie

+0

Xem câu trả lời của tôi tại http://stackoverflow.com/a/28208606/214728, điều này sẽ hoạt động tương tự như colour_tab: = colour_tab ('RED', 'WHITE' , Mã 'BLUE') –

3

Loại bản ghi được thiết kế thực sự để giữ hàng từ các câu lệnh 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 .... 

Rõ ràng cho trường hợp truy vấn không phải là một SELECT * FROM một bảng duy nhất (vì trong kịch bản mà chúng ta có thể sử dụng %ROWTYPE để thay thế.

6

Sử dụng một chức năng để hoạt động như một loại "nhà xây dựng" chức năng (nhìn vào hàm 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

Bạn có thể tạo một hàm trả lại loại kỷ lục

Xem dưới đây mẫu mã:

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 cho phép ghi lại khởi với 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; 
/

Bạn có thể chạy các mẫu mã trên trong Oracle Sống SQL here. (Thật không may là trang web yêu cầu đăng nhập. Vì 18c không có sẵn để tải xuống nhưng không có nhiều cách thuận tiện để thử nghiệm các tính năng mới.)