好的,所以我对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

谢谢你的帮助。

最佳答案

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

07-27 19:02