我应该如何在插入DML语句中使用对象类型?

时间:2017-08-10 06:36:23

标签: oracle plsql user-defined-types

我创建了两个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;

2 个答案:

答案 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更有意义。