2016-01-29 60 views
1

我尝试使用命令insert into select...,但它不起作用。我如何将关系表中的数据加载到对象关系表中?将我的数据从关系表中插入到对象关系表中

为表分类

例子:

insert into CATEGORIES_NEW select * from Categories; 

上述工作,但类似的方式不为其他表工作。

下面是所有表:

关系表

CREATE TABLE Customers (
    CUSTOMERID NUMBER NOT NULL, 
    FIRSTNAME VARCHAR2 (20) NOT NULL, 
    LASTNAME VARCHAR2 (20) NOT NULL, 
    ADDRESS1 VARCHAR2 (40) NOT NULL, 
    ADDRESS2 VARCHAR2 (40), 
    CITY VARCHAR2 (20) NOT NULL, 
    STATE VARCHAR2 (20) NOT NULL, 
    ZIP VARCHAR2 (20) NOT NULL, 
    COUNTRY VARCHAR2 (20) NOT NULL, 
    REGION VARCHAR2 (20) NOT NULL, 
    EMAIL VARCHAR2 (20) NOT NULL, 
    PHONE VARCHAR2 (20) NOT NULL, 
    CREDITCARDTYPE VARCHAR2 (20) NOT NULL, 
    CREDITCARD VARCHAR2 (20) NOT NULL, 
    CREDITCARDEXPIRATION VARCHAR (10) NOT NULL, 
    USERNAME VARCHAR2 (20) NOT NULL, 
    "PASSWORD" VARCHAR2 (20) NOT NULL, 
    AGE NUMBER NOT NULL, 
    INCOME NUMBER NOT NULL, 
    GENDER VARCHAR2 (8) NOT NULL, 
    PRIMARY KEY (CUSTOMERID)); 

    CREATE TABLE Orders (
    ORDERID NUMBER NOT NULL, 
    ORDERDATE DATE NOT NULL, 
    CUSTOMERID NUMBER NOT NULL REFERENCES Customers, 
    NETAMOUNT NUMBER NOT NULL, 
    TAX NUMBER NOT NULL, 
    TOTALAMOUNT NUMBER NOT NULL, 
    PRIMARY KEY (ORDERID)); 

    CREATE TABLE Categories (
    "CATEGORY" NUMBER NOT NULL, 
    CATEGORYNAME VARCHAR (20) NOT NULL, 
    PRIMARY KEY ("CATEGORY")); 

CREATE TABLE Products (
    PROD_ID NUMBER NOT NULL , 
    "CATEGORY" NUMBER NOT NULL REFERENCES Categories, 
    TITLE VARCHAR (40) NOT NULL, 
    ACTOR VARCHAR (40) NOT NULL, 
    PRICE VARCHAR (40) NOT NULL, 
    PRIMARY KEY (PROD_ID)); 

    CREATE TABLE Orderlines (
    ORDERLINEID NUMBER NOT NULL, 
    ORDERID NUMBER NOT NULL REFERENCES Orders, 
    PROD_ID NUMBER NOT NULL REFERENCES Products, 
    QUANTITY NUMBER NOT NULL, 
    ORDERDATE VARCHAR2 (80) NOT NULL, 
    PRIMARY KEY (ORDERLINEID,ORDERID)); 

对象关系表

CREATE TYPE Customer_obj AS OBJECT (
    CUSTOMERID NUMBER, 
    CUST_NAME NAME, 
    CUST_ADDRESS ADDRESS_TYPE, 
    CUST_CONTACT CONTACT_INFO, 
    CUST_CREDITCARD CREDITCARD_INFO, 
    CUST_PERSONALINFO PERSONAL_INFO 
); 

CREATE TYPE NAME AS OBJECT (
    FIRSTNAME VARCHAR2(80) , 
    LASTNAME VARCHAR2(80) 
); 


CREATE TYPE ADDRESS_TYPE AS OBJECT (
    ADDRESS VARCHAR2(280) , 
    CITY VARCHAR2(80) , 
    STATE VARCHAR2(20), 
    ZIP VARCHAR2(40) , 
    COUNTRY VARCHAR2(40) , 
    REGION VARCHAR2(40) 
); 


CREATE TYPE CONTACT_INFO AS OBJECT (
    EMAIL VARCHAR2(40), 
    PHONE VARCHAR2(40) 
); 



CREATE TYPE CREDITCARD_INFO AS OBJECT (
CREDITCARDTYPE VARCHAR2(40) , 
CREDITCARD VARCHAR2(40) , 
CREDITCARDEXPIRATION VARCHAR2(40) 
); 


CREATE TYPE PERSONAL_INFO AS OBJECT ( 
    USERNAME VARCHAR2(80) , 
    PASSWORD VARCHAR2(80) , 
    AGE NUMBER , 
    INCOME NUMBER , 
    GENDER VARCHAR(20) 
); 




CREATE TABLE CUSTOMERS_NEW OF Customer_obj(
PRIMARY KEY (CUSTOMERID)); 



CREATE TYPE Categories_obj AS Object(
    CATEGORY NUMBER , 
    CATEGORYNAME VARCHAR2(80)); 

CREATE TABLE CATEGORIES_NEW OF Categories_obj(
    PRIMARY KEY (CATEGORY)); 


CREATE TYPE Orders_obj AS Object(
    ORDERID NUMBER , 
    ORDERDATE VARCHAR2(400), 
    CUSTOMERID NUMBER, 
    NETAMOUNT NUMBER , 
    TAX NUMBER, 
    TOTALAMOUNT NUMBER 
    ); 

CREATE TABLE ORDERS_NEW OF Orders_obj(
    PRIMARY KEY (ORDERID), 
    FOREIGN KEY(CUSTOMERID) REFERENCES CUSTOMERS_NEW 
); 

CREATE TYPE Products_obj AS Object(
    PROD_ID NUMBER , 
    CATEGORY NUMBER , 
    TITLE VARCHAR2 (40) , 
    ACTOR VARCHAR2 (40) , 
    PRICE VARCHAR2 (40) 
); 

CREATE TABLE PRODUCTS_NEW OF Products_obj(
    PRIMARY KEY (PROD_ID), 
    FOREIGN KEY (CATEGORY) REFERENCES CATEGORIES_NEW 
); 

CREATE TYPE Orderlines_obj AS Object(
    CUST_ID_INFO ID_INFO, 
    QUANTITY NUMBER, 
    ORDERDATE VARCHAR2 (80) 
); 


CREATE TYPE ID_INFO AS Object (
    ORDERLINEID NUMBER , 
    ORDERID NUMBER , 
    PROD_ID NUMBER 
); 


CREATE TABLE ORDERLINES_NEW OF Orderlines_obj(
PRIMARY KEY (CUST_ID_INFO.ORDERLINEID,CUST_ID_INFO.ORDERID), 
FOREIGN KEY (CUST_ID_INFO.ORDERID) REFERENCES ORDERS_NEW, 
FOREIGN KEY (CUST_ID_INFO.PROD_ID) REFERENCES PRODUCTS_NEW 
); 

回答

0

对象表是棘手的,而且很可能就得不偿失。但不管怎么说。

您正在使用对象,这意味着您需要实例化它们。当对象表定义在只有标量属性的类型上时,Oracle足够聪明地隐式地实例化对象。但是,当Type很复杂时,带有属性的类型ypu需要明确地实例化它们。

这里是CUSTOMERS_NEW

insert into CUSTOMERS_NEW 
select Customer_obj (
     c.CUSTOMERID , 
     c.FIRSTNAME||' '||c.LASTNAME , 
     ADDRESS_TYPE(
      c.ADDRESS1||' ' ||c.ADDRESS2 , 
      c.CITY , 
      c.STATE , 
      c.ZIP , 
      c.COUNTRY , 
      c.REGION 
     ), 
     CONTACT_INFO(
      c.EMAIL, 
      c.PHONE 
     ), 
     CREDITCARD_INFO (
      c.CREDITCARDTYPE , 
      c.CREDITCARD , 
      c.CREDITCARDEXPIRATION 
     ), 
     PERSONAL_INFO ( 
      c.USERNAME, 
      c.PASSWORD, 
      c.AGE , 
      c.INCOME , 
      c.GENDER 
    ) 
) 
from customers ; 
插入