ORACLE 如何使用具有动态假脱机位置的假脱机

Posted

技术标签:

【中文标题】ORACLE 如何使用具有动态假脱机位置的假脱机【英文标题】:ORACLE How to use spool with dynamic spool location 【发布时间】:2009-08-07 18:40:42 【问题描述】:

好的,所以我是甲骨文的新手。现在已经不碍事了;

我认为您可以了解我在下面尝试做的事情。 对于找到的每个存储过程,将 DDL 输出到带有其名称的文件名。

问题是我不知道如何让假脱机目标获取由光标设置的 FileName 的值。

DECLARE 
objName varchar2(50);
FileName varchar2(50);

cursor curProcs is
    select OBJECT_NAME into objName
      FROM ALL_PROCEDURES WHERE OWNER = 'AMS' 
      ORDER BY OBJECT_NAME; -- get all procs in db
BEGIN
open curProcs;
  if curProcs%ISOPEN THEN
   LOOP
    FETCH curProcs into objName;
    EXIT WHEN curProcs%NOTFOUND;
    FileName := 'C:\ ' || objName || '.PRC.SQL';
    spool FileName; --BREAKS
     DBMS_METADATA.GET_DDL('PROCEDURE',objName);
    spool off;
   END LOOP;
  END IF;
END; 

关于我哪里出错的任何想法?如果有人有这方面的例子,我将不胜感激。

我觉得我必须在它周围跳舞,因为如果我最初创建一个专栏 那么

spool &ColName

我得到了一个结果,我似乎无法动态更改 &colname

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我找到了一个更好的解决方案,无需声明/开始/结束代码块或查询语句。

可以通过以下方式获得带有日期和时间的示例假脱机文件名:


sql> column dt new_value _dt 
sql> select to_char(sysdate,'ddMONyyyy_hh24mi') dt from dual; 
sql> spool &_dt
我的文件名:

27JUN2011_1727.lst

如果需要,您甚至可以指定文件扩展名(例如 .txt)。只需创建另一个变量。

来源: http://oracle.ittoolbox.com/groups/technical-functional/oracle-apps-l/variable-file-name-with-spool-1508529

【讨论】:

+1 这对我来说效果更好,因为它不需要像接受的答案那样创建另一个脚本。【参考方案2】:

SPOOL 是一个 SQLPlus 指令,您不能将它混入 PL/SQL 匿名块中。如果您打算纯粹在 SQLPlus 中执行此操作,我认为一般的想法是分两次处理,即使用第一个脚本动态生成假脱机文件名引用到第二个脚本中,该脚本实际上使dbms_metadata 调用。

[编辑]

This should be close to what you need - maybe a line termination problem, depending on your platform:

    set pagesize 0
    set linesize 300
    spool wrapper.sql
    select
    'spool '||object_name||'.sql'||chr(10)||
    'begin 
    dbms_metadata.get_ddl('||chr(39)||object_type||chr(39)||','||chr(39)||object_name||chr(39)||')'||' end;'||chr(10)||
    '/'||chr(10)||
    'spool off'
    from user_objects
    where object_type = 'PROCEDURE'
;
spool off

【讨论】:

嘿 - 这并不难 - 我会用足够接近的东西来编辑我的答案,让你开始【参考方案3】:

我认为 UTL_FILE 在这里更适合您的需求。 SPOOL 实际上应该是一个命令 sqlplus 将输出写入文件。通常我将它用于诸如...“嘿,DBA 运行我的脚本并将输出发送给我”之类的东西。

首先你需要定义一个目录。语法很简单:


CREATE DIRECTORY SQLOUTPUT AS 'c:\temp\';

现在您可以在代码中使用它:


DECLARE

  -- Get all procedure from All_Objects
  -- You could expand this to pass in the object_type you are looking for
  CURSOR csr IS
    SELECT object_type
      , object_name
    FROM All_Objects
    WHERE object_type = 'PROCEDURE'
    AND owner = 'AMS';

  -- define a file handler type
  outputfile UTL_FILE.file_type;

BEGIN

FOR c IN csr LOOP

  -- open your file using the procedure name from the cursor
  outputfile := UTL_FILE.fopen('SQLOUTPUT',c.object_name||'.prc.sql','W');

  -- output the metadata results just like DBMS_OUTPUT except to a file
  UTL_FILE.put_line(outputfile, DBMS_METADATA.get_ddl(c.object_type, c.object_name));

  -- make sure to close the file when you are done.
  UTL_FILE.fclose(outputfile);

END LOOP;
  -- go home early today ...
END;

【讨论】:

以上是关于ORACLE 如何使用具有动态假脱机位置的假脱机的主要内容,如果未能解决你的问题,请参考以下文章

如何将从文件上传小部件上传的假脱机文件传递到 C FILE *f 指针

在管道分隔的 sqlplus 中带有列标题的假脱机

SQL*Plus 中带有多个参数的假脱机输出

使用 SQL Developer (SQLcl) 假脱机到动态位置

sqlplus 动态假脱机文件名

Oracle SQL 自动并行假脱机