Инициализация типа записи pl / sql - PullRequest
7 голосов
/ 07 ноября 2011

В PL / SQL varray может быть инициализировано во время создания как:

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'
    );

Ответы [ 6 ]

7 голосов
/ 29 января 2015

Используйте функцию, чтобы действовать как своего рода «конструктор» (смотрите на функцию 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;  
4 голосов
/ 07 ноября 2011

Нет, нет.Вы должны назначить каждое значение явно. Ссылка на документацию здесь .

3 голосов
/ 08 ноября 2011

Типы записей действительно предназначены для хранения строк из операторов 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 вместо.

2 голосов
/ 15 марта 2019

Инициализация записи выполняется в ее декларации и запишите назначение, выбрав в DUAL:

    declare
        type location_record_type is record
        (
            street_address       varchar2(40) := '1234 Fake Street',
            postal_code          varchar2(12) := '90210',
            city                 varchar2(30) := 'Springfield',
            state_province       varchar2(25) := 'KY',
            country_id           char(2) not null := 'US'
        );
        v_location location_record_type;

   begin 
      select 
        '4321 Another St.', '48288', 'Detroit', 'MI', v_location.country_id
      into v_location from dual;
    end;
    /
0 голосов
/ 01 марта 2018

Oracle 18c позволяет инициализировать запись с квалифицированными выражениями :

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 Live SQL здесь .(К сожалению, этот сайт требует входа в систему. Поскольку 18c недоступен для загрузки, пока не так много удобных способов протестировать новые функции.)

0 голосов
/ 24 ноября 2017

Вы можете создать функцию, которая возвращает этот тип записи.

См. Ниже пример кода:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...