【问题标题】:Oracle: Dynamically create package scripts without writing to a fileOracle:动态创建包脚本而不写入文件
【发布时间】:2014-02-20 05:42:57
【问题描述】:

我在我的 oracle 数据库中建立了自己的表存储库。

我使用这个存储库为每个表创建标准包。 到目前为止,我将一堆脚本写入一个实用文件夹。

我不想再通过文件系统走那种额外的路了。

这是一个示例文件:

CREATE OR REPLACE PACKAGE vpk_0003_produkte
AS

   TYPE t_cursor IS REF CURSOR;

   PROCEDURE p_insert (p_rc                  OUT NUMBER,
                       p_rc_text             OUT VARCHAR2,
                       p_logsql            IN     NUMBER,
                       p_logperformance   IN     NUMBER,
                       p_user_id            IN     NUMBER,
                       p_mandant          IN  NUMBER, 
                       -- PK Columns
  p_id IN OUT x_0003_produkte.id%TYPE
                       -- Other Columns
, p_requestid IN     x_0003_produkte.requestid%TYPE);

   PROCEDURE p_update (p_rc                  OUT NUMBER,
                       p_rc_text             OUT VARCHAR2,
                       p_logsql            IN     NUMBER,
                       p_logperformance   IN     NUMBER,
                       p_user_id            IN     NUMBER,
                       p_mandant          IN  NUMBER, 
                       p_where            IN     VARCHAR2,
                       -- PK Columns
  p_id IN OUT x_0003_produkte.id%TYPE
                       -- Other Columns
, p_requestid IN     x_0003_produkte.requestid%TYPE);

END vpk_0003_produkte;

有没有办法直接执行这些行而不写文件? 我知道“OPEN CURSOR FOR”与包含 SELECT 以获取数据的变量结合使用。但是如何执行/编写呢?

附加信息:一个包代码很容易有 27.000 个字符!大约 1000 行。

谢谢。

【问题讨论】:

    标签: oracle file package execute


    【解决方案1】:

    如果您可以将包 DDL 的整个源代码组装到单个 VARCHAR2(32000) 局部变量中,您应该可以使用 EXECUTE IMMEDIATE 来运行 DDL

    EXECUTE IMMEDIATE l_your_ddl_stmt;
    

    根据 Oracle 版本,如果 DDL 语句可能超过 32000 字节,您可以使用 CLOB 调用 EXECUTE IMMEDIATE。您还可以使用 dbms_sql 传递 VARCHAR2(4000) 字符串的集合,这些字符串组合到您要执行的 DDL 中。

    假设您正在将生成的代码签入源代码管理,但不仅仅是签入生成包的代码,在文件系统上生成文件作为中间步骤可能会更容易,因为这允许您提交源代码管理并在数据库中创建对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2020-02-05
      • 1970-01-01
      相关资源
      最近更新 更多