2011-11-07 18 views
7

En PL/SQL, un varray se puede inicializar a la hora de la creación como:La inicialización de un PL/SQL tipo de registro

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

¿Existe un método equivalente de inicialización para este tipo de registro 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

Si hace ese tipo de objeto de base de datos, puede hacerlo. O creo que debes hacerlo si no creas una función constructora para el tipo de objeto. –

+0

Ver mi respuesta en http://stackoverflow.com/a/28208606/214728, esto debería funcionar de manera similar a la codificación colour_tab: = colour_tab ('ROJO', 'BLANCO', 'AZUL') –

Respuesta

5

No, no lo hay. Tienes que asignar cada valor de forma explícita. Documentation reference here.

+0

Ok, supongo que estoy atascado con haciéndolo manualmente. :) – ziggy

+0

Lo sé, lo odio también ;-) – DCookie

+0

Ver mi respuesta en http://stackoverflow.com/a/28208606/214728, esto debería funcionar similar a la colour_tab: = colour_tab ('RED', 'WHITE' , 'AZUL') codificaciones –

3

Los tipos de registros están diseñados para contener filas de instrucciones 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 .... 

Obviamente, para los casos en que la consulta no es un SELECT * FROM una sola tabla (ya que en ese escenario se puede utilizar en lugar %ROWTYPE.

6

utilizar una función de actuar como una especie de "constructor" función (mirada en función 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

puede crear una función que regresar ese tipo de registro

véase a continuación código de ejemplo:

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 permite registro de inicialización con 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; 
/

Puede ejecutar el código de ejemplo anterior en Oracle SQL vivo here. (Lamentablemente, ese sitio requiere un inicio de sesión. Dado que 18c no está disponible para su descarga, no existen muchas maneras convenientes de probar nuevas características).

Cuestiones relacionadas