【问题标题】:Calling a member procedure in Oracle 11g在 Oracle 11g 中调用成员过程
【发布时间】:2011-01-20 12:49:53
【问题描述】:

假设我有:

create type address as object (
   line1 varchar2(50),
   city varchar2(50),
   member procedure insert_address(line1 varchar2, city varchar2)
)
/

create table address_table of address;

create type body address as
   member procedure insert_address(line1 varchar2, city varchar2) is
   begin
       insert into address_table values (line1, city);
       commit;
   end insert_address;
end;
/

如何拨打insert_address

通过执行以下操作,我得到invalid number or types of arguments

begin
   address.insert_address('123 my road','london');
end;

我可以这样做并且它有效,但似乎是个坏主意:

declare
  v_address address := new address(null,null);
begin
  v_address.insert_address('123 my road','london');
end;

谢谢

【问题讨论】:

  • 你所做的似乎没有多大意义。如果您不希望您的类型表现出面向对象的行为,最好创建一个简单的包。在我看来,您即将将概念从 Java 或 C# 等直接转移到 PL/SQL。

标签: sql oracle ora-01722


【解决方案1】:

正如您构建的那样(这很奇怪),过程 insert_address 只能在地址类型的对象的上下文中调用,并且必须使用参数 line1 和 city 调用,其值与对象无关你称它为“为”。这就是我构建表格和代码并使用它的方式:

create table address_table (line1 varchar2(50), city varchar2(50));

create package address_pkg as
   procedure insert_address(p_line1 varchar2, p_city varchar2);
end;
/

create package body address_pkg as
   procedure insert_address(p_line1 varchar2, p_city varchar2) is
   begin
      insert into address_table (line1, city) values (p_line1, p_city);
   end;
end;
/

exec address_pkg.insert_address ('123 my road', 'london');

使用您更有趣的模型,insert_address 过程似乎应该将“地址对象本身”插入表中。比如:

create type address as object (
   line1 varchar2(50),
   city varchar2(50),
   member procedure insert_address
)
/

create table address_table of address;

create type body address as
   member procedure insert_address is
   begin
       insert into address_table values (line1, city);
       commit;
   end insert_address;
end;
/

那么插入会是这样的:

declare
  v_address address := new address('123 my road','london');
begin
  v_address.insert_address;
end;

【讨论】:

  • 由于这是另一个学术练习,我们被告知不能使用包,所以我正在寻找其他方法。
  • 我认为这种“对象关系”的唯一目的是为学术练习提供材料!在“现实世界”中以这种方式构建表格是没有意义的! ;-)
【解决方案2】:

在您的过程中使用static 而不是member

static procedure insert_address(line1 varchar2, city varchar2)

然后你可以在对象类型而不是实例上调用它:

address.insert_address('123 my road','london');

更多信息请参见Using PL/SQL Object Types

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 2011-01-19
    • 2014-12-15
    • 2011-01-20
    • 1970-01-01
    • 2011-01-04
    • 2012-09-26
    • 1970-01-01
    • 2019-05-16
    相关资源
    最近更新 更多