2017-08-10 40 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爲對象名稱。