gpt4 book ai didi

Oracle 向一个对象类型添加一个新的成员函数/过程

转载 作者:行者123 更新时间:2023-12-02 00:27:10 24 4
gpt4 key购买 nike

我正在尝试执行以下操作;假设我在 Oracle 中创建了一个对象类型

create type test as object(
name varchar2(12),
member procedure print1);
/
create type body test is
member procedure print1 is
begin
dbms_output.put_line('Test');
end print1;
end;
/

现在我想添加一个新的成员过程 print2 - 同样,我可以通过键入:

alter type test
add member procedure print2 cascade;

现在,我的问题是:如何只定义 body 并添加 print2 而无需重复其他定义?我知道我可以为这两个过程创建或替换主体测试并列出实现,但这不切实际,因为我必须维护其他人编写的对象类型的代码,而且我不知道他们是如何实现代码的,只是这些过程和功能存在。

我浏览了文档和网络,但找不到答案,而且 Oracle 希望开发人员再次输入所有定义对我来说似乎很愚蠢。

问候,乔治

最佳答案

如何创建一个动态添加定义到类型的过程:

create or replace procedure add_procedure(p_new_procedure_definition varchar2)
authid current_user
is
v_object_type_body varchar2(32767) := 'create or replace ';
begin
--Build string with current definitions
for source_code in
(
select text
from user_source
where name = 'TEST'
and type = 'TYPE BODY'
order by line
) loop
--Don't include the last "END;" yet.
--(Huge assumption that the package ends with "END;")
if replace(upper(trim(source_code.text)),chr(10)) <> 'END;' then
v_object_type_body := v_object_type_body||source_code.text;
end if;
end loop;

--Add new definition
v_object_type_body := v_object_type_body||chr(10)||
p_new_procedure_definition||chr(10)||'end;';

--For debugging
--dbms_output.put_line(v_object_type_body);

--Compile the type
execute immediate v_object_type_body;
end;
/

然后像这样运行它:

begin
add_procedure(
'
member procedure print2 is
begin
dbms_output.put_line(''Test2'');
end print2;
'
);
end;
/

尽管您需要对包裹的结束方式做出一些相当大的假设。要使其成为真正通用的解决方案,您需要构建一个 PL/SQL 解析器,这基本上是不可能的。该过程仅适用于 32K,如果类型非常大,您可能需要使用 CLOB。

关于Oracle 向一个对象类型添加一个新的成员函数/过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8461756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com