如何自动部署存在于 clob 列中的过程
Posted
技术标签:
【中文标题】如何自动部署存在于 clob 列中的过程【英文标题】:How to deploy a procedure automatically which is present in a clob column 【发布时间】:2018-01-30 10:53:55 【问题描述】:我有一个包含 clob 列的表。在 clob 列中,我有一个包,我想在没有手动干预的情况下编译它。谁能告诉我这在 PLSQL 中是否可行。
注意:clob 列中的包尚未存在于数据库中。这是我想编译的新东西。
【问题讨论】:
【参考方案1】:不确定您所说的“无需人工干预”是什么意思,但是您可以创建一个对象,例如从存储在 CLOB 列中的数据打包。例如:
insert into mytable (id, clob_col) values
(1, 'create or replace package p1 as procedure proc1; end;');
commit;
然后
declare
clob_val clob;
begin
select clob_col into clob_val
from mytable
where id = 1;
execute immediate clob_val;
end;
当然,一个包有两个部分,规范和主体。因此,理想情况下,您需要单独存储它们(例如,1 行用于规范,另一行用于主体)。如果它们在同一个 CLOB 值内,那么您需要在运行 execute immediate
之前解析 CLOB 值并单独提取它们。
【讨论】:
托尼和其他人,很抱歉跳进这个讨论并跑题了。你知道dBforums发生了什么吗?它死了吗?我无法访问它......唷,一个月左右;我被重定向到其他网站,但找不到任何相关信息。 @Littlefoot 我没有注意到一两个月没有尝试过,但我明白你的意思。不知道发生了什么。【参考方案2】:如果一个表中有多个 PL/SQL 过程,您将使用循环。这是一个例子:
SQL> create table test (id number, col clob);
Table created.
SQL> insert into test values
2 (1, 'create or replace package pkg_test as ' ||
3 ' function today return date; ' ||
4 'end;'
5 );
1 row created.
SQL> insert into test values
2 (2, 'create or replace package body pkg_test as ' ||
3 ' function today return date is ' ||
4 ' begin ' ||
5 ' return sysdate; ' ||
6 ' end; ' ||
7 ' end;'
8 );
1 row created.
SQL> declare
2 cursor c1 is
3 select id, col
4 from test
5 order by id;
6 c1r c1%rowtype;
7 begin
8 open c1;
9 loop
10 fetch c1 into c1r;
11 exit when c1%notfound;
12
13 execute immediate(c1r.col);
14 end loop;
15 close c1;
16 end;
17 /
PL/SQL procedure successfully completed.
SQL> select pkg_test.today from dual;
TODAY
----------------
30.01.2018 12:50
SQL>
呜呼!有效!
【讨论】:
以上是关于如何自动部署存在于 clob 列中的过程的主要内容,如果未能解决你的问题,请参考以下文章