Как вставить данные в таблицу, которая имеет ссылку и область видимости - PullRequest
0 голосов
/ 29 июня 2018

Это мой пользовательский тип, который я создал.

create or Replace TYPE cust_address_typ_new AS OBJECT
    ( add_id NUMBER,   
    street_address     VARCHAR2(40)
    , postal_code        VARCHAR2(10)
    , city               VARCHAR2(30)
    , state_province     VARCHAR2(10)
    , country_id         CHAR(2)
    );

и ниже таблица нового типа

CREATE TABLE address_table OF cust_address_typ_new;

Теперь я создал еще одну таблицу, как показано ниже

CREATE TABLE customer_addresses (
   add_id NUMBER, 
   address REF cust_address_typ_new
   SCOPE IS address_table);

и теперь я пытаюсь вставить значения в customer_addresses таблицу

insert into customer_addresses
values(1,SYSTEM.CUST_ADDRESS_TYP_NEW(1,'hi','87987','city','state',''))

1 Ответ

0 голосов
/ 29 июня 2018

Использование sqlcl (Oracle 12.1):

create or Replace TYPE cust_address_typ_new AS OBJECT ( 
  add_id NUMBER
, street_address VARCHAR2(40) 
, postal_code VARCHAR2(10) 
, city VARCHAR2(30) 
, state_province VARCHAR2(10) 
, country_id CHAR(2) 
);
/
-- Type CUST_ADDRESS_TYP_NEW compiled

CREATE TABLE address_table OF cust_address_typ_new ;
-- Table ADDRESS_TABLE created.

CREATE TABLE customer_addresses ( 
  add_id NUMBER
, address REF cust_address_typ_new SCOPE IS address_table
);
-- Table CUSTOMER_ADDRESSES created.

Ошибка

insert into customer_addresses 
values ( 1, SYSTEM.CUST_ADDRESS_TYP_NEW(1,'hi','87987','city','state','') ) ;

-- ORA-00904: "SYSTEM"."CUST_ADDRESS_TYP_NEW": invalid identifier

insert into customer_addresses 
values ( 1, CUST_ADDRESS_TYP_NEW( 1,'hi','87987','city','state','' ) ) ;

-- ORA-00932: inconsistent datatypes: expected REF ...CUST_ADDRESS_TYP_NEW got ...CUST_ADDRESS_TYP_NEW

Из документации :

REF принимает в качестве аргумента корреляционную переменную (псевдоним таблицы) связанный со строкой таблицы объектов или представления объекта. REF значение возвращается для экземпляра объекта, который связан с переменная или строка.

Следующие примеры могут вам помочь:

-- {1} insert into the address_table ( 3 examples )

insert into address_table 
values (  1,'hi','87987','city','state','' ) ;

-- 1 row inserted.

insert into address_table
values( cust_address_typ_new( 2,'hi again','12345','city2','state2','' ) ) ;

-- 1 row inserted

insert into address_table
values( new cust_address_typ_new( 3,'hmpf','23456','city3','state3','' ) ) ;

-- 1 row inserted.

-- result
SQL> select * from address_table;
ADD_ID  STREET_ADDRESS  POSTAL_CODE  CITY   STATE_PROVINCE  COUNTRY_ID  
1       hi              87987        city   state           NULL        
2       hi again        12345        city2  state2          NULL        
3       hmpf            23456        city3  state3          NULL 

Возможно, вам не нужна последовательность (просто добавлена ​​для заполнения столбца add_id в таблице customer_addresses).

-- {2} select from the address_table, use ref(), 
--     insert into customer_addresses

SQL> create sequence ca_seq start with 1000 increment by 1;
Sequence CA_SEQ created.

insert into customer_addresses
select ca_seq.nextval, ref(AT) from address_table AT ;

-- result
select * from customer_addresses;
    ADD_ID
----------
ADDRESS
------------------------------------------------------------------------
      1000 
2202086FC2AC912CD41038E0530100007F525D6FC2AC912CCD1038E0530100007F525D                                                     

      1001 
2202086FC2AC912CD51038E0530100007F525D6FC2AC912CCD1038E0530100007F525D                                                     

      1002 
2202086FC2AC912CD61038E0530100007F525D6FC2AC912CCD1038E0530100007F525D 
...