【问题标题】:Possible to create Oracle Database object types inside of PL/SQL?可以在 PL/SQL 中创建 Oracle 数据库对象类型吗?
【发布时间】:2010-11-07 08:06:45
【问题描述】:

是否可以在 Oracle 数据库 10g 中的包内创建对象类型?比如:

create or replace package my_package as 
    type my_type as object (
        id number(15) 
     ); 
end;

给予:

错误(3,9):PLS-00540:此上下文中不支持对象。

我最终希望能够做的是使用多态性,但也允许对象访问表并使用 PL/SQL,这在包外定义的类型中是不允许的。

谢谢, 杰夫

【问题讨论】:

  • 是的,只是添加了错误。谢谢。
  • 这在 oracle 11.2 中仍然不起作用......这在 pl/sql 的祖先 Pascal 和 ADA 中都是可能的;所以我想我们会很快到达那里。

标签: oracle plsql


【解决方案1】:

来自Oracle 10g documentation

目前,您无法定义对象 PL/SQL 块、子程序中的类型, 或包装。

所以,很遗憾,没有。

【讨论】:

  • 确实不能在 PL/SQL 中定义对象类型,但可以在 PL/SQL 之外定义的对象主体中使用 PL/SQL。 jlpp 做出了错误的假设。
【解决方案2】:

Oracle 11g 第 2 版更新:

来自Oracle Database Object-Relational Developer's GuideChapter 3 Using PL/SQL With Object Types

在 PL/SQL 块、子程序或包中使用对象类型是一个两步过程。

  1. 您必须在 SQL*Plus 或其他类似程序中使用 SQL 语句 CREATE TYPE 定义对象类型。

    在模式中定义并安装对象类型后,您可以在任何 PL/SQL 块、子程序或包中使用它。

  2. 在 PL/SQL 中,然后声明一个变量,其数据类型是您刚刚定义的用户定义类型或 ADT。

【讨论】:

  • 最初的问题是关于“创建”包内的对象。您的回复是关于在 plsql 块/包中“使用”对象...这是非常不同的主题。
【解决方案3】:

您可以在 PL/SQL 包之外定义的对象中使用 PL/SQL!使用物体:

CREATE TYPE person_typ AS OBJECT (
  idno           NUMBER,
  first_name     VARCHAR2(20),
  last_name      VARCHAR2(25),
  email          VARCHAR2(25),
  phone          VARCHAR2(20),
  MAP MEMBER FUNCTION get_idno RETURN NUMBER, 
  MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ));
/

CREATE TYPE BODY person_typ AS
  MAP MEMBER FUNCTION get_idno RETURN NUMBER IS
  BEGIN
    RETURN idno;
  END;
  MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ) IS
  BEGIN
    -- use the PUT_LINE procedure of the DBMS_OUTPUT package to display details
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' ' || first_name || ' ' || last_name);
    DBMS_OUTPUT.PUT_LINE(email || ' '  || phone);
  END;
END;
/

从这个链接复制粘贴这个例子:http://www.mcs.csueastbay.edu/support/oracle/doc/10.2/appdev.102/b14260/adobjint.htm

【讨论】:

  • 我知道它已经 9 岁了,但是伙计,这并不能解决问题。
猜你喜欢
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2020-05-29
  • 2011-10-17
  • 2022-08-17
相关资源
最近更新 更多