2017-08-10 89 views
1

我已经创建了两个TYPE对象来尝试PL/SQL中的OOP处理。 我试图在我的INSERT语句中使用我的类型o_customers,但我无法做到。如何在插入DML语句中使用对象类型?

有一个Customers表。它与o_customers有相同的列。

create or replace type o_customers as object (
id number, 
name varchar2(40), 
age number, 
address o_addressC, 
salary number 
); 

create or replace type o_addressC as object (
mahalle varchar(30), 
apartman varchar(15), 
ilce varchar(15), 
apt_no number 
); 

declare 
    adres o_addressC; 
    musteri o_customers; 
begin 
    adres := o_addressC('selami ali mah','çınar apt',' üsküdar',19); 
    musteri:= o_customers(10,'UĞUR SİNAN SAĞIROĞLU',26,adres,1000); 
    insert into customers values (musteri); 
end; 

回答

0

" There is a customers table. it has same columns with o_customers"

在OOP是不够的对象具有相同的结构是在编程方面兼容的:他们必须是同一类型,或通过继承相互关联。

所以你需要使用该类型来创建表:

SQL> create table customers of o_customers 
    2/

Table created. 

SQL> desc customers 
Name     Null? Type 
---------------------- -------- ------------- 
ID        NUMBER 
NAME       VARCHAR2(40) 
AGE        NUMBER 
ADDRESS       O_ADDRESSC 
SALARY       NUMBER 

SQL> 

现在你的插入语句将工作:

SQL> declare 
    2  adres o_addressC; 
    3  musteri o_customers; 
    4 begin 
    5  adres := o_addressC('selami ali mah','cınar apt','uskudar',19); 
    6  musteri:= o_customers(10,'UĞUR SİNAN SAĞIROĞLU',26,adres,1000); 
    7  insert into customers values(musteri); 
    8 end; 
    9/

PL/SQL procedure successfully completed. 

SQL> select * from customers; 

     ID NAME           AGE 
---------- ---------------------------------------- ---------- 
ADDRESS(MAHALLE, APARTMAN, ILCE, APT_NO) 
------------------------------------------------------------------------------------------------------------------------------------------------------ 
    SALARY 
---------- 
     10 UĞUR SİNAN SAĞIROĞLU        26 
O_ADDRESSC('selami ali mah', 'c??nar apt', ' uskudar', 19) 
     1000 


SQL> 

顺便说一句,我不得不做出插入的值微小变化因为投递声明投掷了

declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 6

这是因为您的o_addressC类型属性对于具有多字节字符的字符串而言太小。

0

除非customers是一个对象表(create table customers of o_customers),你需要参考对象的属性明确:

insert into customers 
(id, name, age, address, salary) 
values 
(musteri.id, musteri.name, musteri.age, musteri.address, musteri.salary); 

顺便说一句,o_customer(无's')会更有意义比o_customers为对象名称。