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