一尘不染

ORACLE如何将假脱机与动态假脱机位置一起使用

sql

好的,所以我对oracle完全满意。现在,这已经不复存在了;

我认为您可以了解我在下面尝试做的事情。对于找到的每个存储过程,将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

谢谢你的帮助。


阅读 147

收藏
2021-03-10

共1个答案

一尘不染

SPOOL是SQL Plus指令,您不能将其混入PL / SQL匿名块中。 如果要纯粹在SQL Plus中 执行此操作
,我认为一般想法是分两步进行处理,即使用第一个脚本动态地将假脱机文件名引用生成到第二个脚本中,该第二个脚本实际上进行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
2021-03-10