2017-08-10 7 views
1

PL/SQLでOOP処理を試す2つのTYPEオブジェクトを作成しました。 INSERTステートメントに自分のタイプo_customersを使用しようとしましたが、できませんでした。挿入DML文にオブジェクト型を使用する方法はありますか?

Customersテーブルがあります。それはo_customersと同じ列を持っています。 OOPで

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"

そのオブジェクトがプログラミングコンテキストで互換性があるように、同じ構造を有するために十分ではない:それらは同じタイプ、または継承を介して相互に関連しなければなりません。

ですから、その型を使用してテーブルを作成する必要があります。

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> 

今すぐあなたのinsert文は動作します:

ちなみに
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')は、AN用o_customersよりも多くの意味を成していないだろうオブジェクト名。

関連する問題