如何删除在oracle中创建的成员函数

如何删除在oracle中创建的成员函数,oracle,ordbms,Oracle,Ordbms,如何删除在oracle type对象中创建的成员函数而不删除整个类型?据我所知,您不能删除(除非调用CREATE或REPLACE不删除) 另外,更糟糕的是,如果有依赖类型将该类型与要删除的成员函数一起使用,则需要删除所有级联。这意味着,作为一个功能,不必吃或喝,让它自己去吧 [编辑;在看到Wernfried的答案后] 看来我错了。显然,它确实有效。语法有点奇怪(它需要指定RETURN子句(?!?),但是嘿,这就是Oracle所说的。所以,今天我学到了一些新东西 例如: SQL> creat

如何删除在oracle type对象中创建的成员函数而不删除整个类型?

据我所知,您不能删除(除非调用CREATE或REPLACE不删除)

另外,更糟糕的是,如果有依赖类型将该类型与要删除的成员函数一起使用,则需要删除所有级联。这意味着,作为一个功能,不必吃或喝,让它自己去吧

[编辑;在看到Wernfried的答案后]

看来我错了。显然,它确实有效。语法有点奇怪(它需要指定RETURN子句(?!?),但是嘿,这就是Oracle所说的。所以,今天我学到了一些新东西

例如:

SQL> create or replace type ttest is object
  2    (some_name varchar2(20),
  3     member function f_name return varchar2
  4    );
  5  /

Type created.

SQL> create or replace type body ttest as
  2    member function f_name
  3      return varchar2
  4    is
  5    begin
  6      return self.some_name;
  7    end f_name;
  8  end;
  9  /

Type body created.

SQL> alter type ttest drop member function f_name return varchar2;

Type altered.

SQL> desc ttest
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 SOME_NAME                                          VARCHAR2(20)

SQL>

就我所知,您不能(除非您调用CREATE或REPLACE来禁止删除)

另外,更糟糕的是,如果有依赖类型将该类型与要删除的成员函数一起使用,则需要删除所有级联。这意味着,作为一个功能,不必吃或喝,让它自己去吧

[编辑;在看到Wernfried的答案后]

看来我错了。显然,它确实有效。语法有点奇怪(它需要指定RETURN子句(?!?),但是嘿,这就是Oracle所说的。所以,今天我学到了一些新东西

例如:

SQL> create or replace type ttest is object
  2    (some_name varchar2(20),
  3     member function f_name return varchar2
  4    );
  5  /

Type created.

SQL> create or replace type body ttest as
  2    member function f_name
  3      return varchar2
  4    is
  5    begin
  6      return self.some_name;
  7    end f_name;
  8  end;
  9  /

Type body created.

SQL> alter type ttest drop member function f_name return varchar2;

Type altered.

SQL> desc ttest
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 SOME_NAME                                          VARCHAR2(20)

SQL>

我从来没用过,但根据你的说法

alter type {type_name} DROP MEMBER {function_spec} CASCADE;
注意,
{function\u spec}
是函数名加返回子句,例如

ALTER TYPE ttest DROP MEMBER FUNCTION f_name_2 RETURN VARCHAR2 CASCADE;

之后,您必须在没有删除功能的情况下重新创建类型正文,即,
创建或替换类型正文…

我从未使用过它,但根据您可能能够使用它

alter type {type_name} DROP MEMBER {function_spec} CASCADE;
注意,
{function\u spec}
是函数名加返回子句,例如

ALTER TYPE ttest DROP MEMBER FUNCTION f_name_2 RETURN VARCHAR2 CASCADE;

之后,您必须重新创建类型主体,而不使用删除的函数,即创建或替换类型主体…

正确,它可以工作。我不知道,所以-谢谢你,@Wernfried。我很确定这在早期版本的Oracle中是不可能的。也许它是在11年加入的。的确,它起作用了。我不知道,所以-谢谢你,@Wernfried。我很确定这在早期版本的Oracle中是不可能的。也许它是在11年加入的。2请检查“desc ttest”命令,看看函数是否已从类型中删除。因为对我来说,它也将输出作为类型更改,但类型具有functionSure;我添加了DESC命令的结果,并更新了我的消息。数据库版本为11.2.0.4.0是否可以检查“desc ttest”命令,查看函数是否已从类型中删除。因为对我来说,它也将输出作为类型更改,但类型具有functionSure;我添加了DESC命令的结果,并更新了我的消息。数据库版本为11.2.0.4.0