如何将数据插入具有引用和作用域的表中

时间:2018-06-29 06:02:30

标签: sql oracle plsql sql-insert

这是我创建的用户定义类型。

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 :(得分:0)

使用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

来自documentation

  

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 

也许您不需要序列(只需添加即可填充customer_addresses表中的add_id列即可)。

-- {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