我应该如何在插入 DML 语句中使用对象类型?
How should I use an object type in an insert DML statement?
我创建了两个 TYPE 对象来尝试 PL/SQL 中的 OOP 处理。
我试图在我的 INSERT 语句中使用我的类型 o_customers
,但我做不到。
有一个客户table。它具有与 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;
" There is a customers table. it has same columns with o_customers"
在 OOP 中,对象具有相同的结构以在编程上下文中兼容是不够的:它们必须是相同的类型,或者通过继承相互关联。
因此您需要使用该类型创建 table:
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
类型属性对于包含多字节字符的字符串来说太小了。
除非 customers
是对象 table (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
更有意义。
我创建了两个 TYPE 对象来尝试 PL/SQL 中的 OOP 处理。
我试图在我的 INSERT 语句中使用我的类型 o_customers
,但我做不到。
有一个客户table。它具有与 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;
" There is a customers table. it has same columns with o_customers"
在 OOP 中,对象具有相同的结构以在编程上下文中兼容是不够的:它们必须是相同的类型,或者通过继承相互关联。
因此您需要使用该类型创建 table:
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
类型属性对于包含多字节字符的字符串来说太小了。
除非 customers
是对象 table (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
更有意义。