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