我创建了两个TYPE对象来尝试在PL / SQL中进行OOP处理。
我试图在我的INSERT语句中使用我的类型o_customers
,但我无法做到。
有一个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 :(得分:0)
"有一个客户表。它与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>
顺便说一句,我不得不对插入的值进行微小的更改,因为发布的语句是
声明
*
第1行的错误:
ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小
ORA-06512:第6行
这是因为对于具有多字节字符的字符串,o_addressC
类型属性太小。
答案 1 :(得分: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
更有意义。