【问题标题】:How to insert data into table which has a ref and scope如何将数据插入具有引用和范围的表中
【发布时间】:2018-06-29 06:02:29
【问题描述】:

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

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

【问题讨论】:

  • 不相关,但为什么要将对象存储在 SYSTEM 架构中?
  • @Kaushik Nayak ,这是默认架构
  • 你的问题是什么?您的代码会产生错误还是其他原因。请澄清您的问题。
  • 没有存储用户数据的默认模式。 docs.oracle.com/database/121/ADMQS/… sys 和 system 仅用于管理任务。如果你将它们转储到 SYS 中,你将面临很多问题。您应该为数据库用户创建一个单独的模式,并在那里创建所有对象。另请阅读:stackoverflow.com/questions/18304174/…
  • 顺便说一下,char 类型通常是无用的,并且是一些晦涩的错误的来源。指定''(空字符串)时是否要插入' '(两个空格)?你知道哪些情况会调用空白填充,哪些不会?字符串最好使用标准的varchar2

标签: sql oracle plsql sql-insert


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多