如何自动部署存在于 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 列中的过程的主要内容,如果未能解决你的问题,请参考以下文章

持续集成之应用k8s自动部署

在存储的 CLOB 中包含自动递增值

用于 Linux 操作系统的 azure devops 发布管道中的自动化 SQL 部署任务

在部署后脚本中使用已删除列中的值的最佳方法是啥

Docker+Jenkins打造自动化测试以及部署升级环境

SQL 部署自动化