好的,所以我是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
感谢您的帮助。
答案 0 :(得分:8)
我找到了一个更好的解决方案,而无需声明/ begin / end代码块或查询语句。
带有日期和时间的示例假脱机文件名可以通过以下方式实现:
sql> column dt new_value _dt
sql> select to_char(sysdate,'ddMONyyyy_hh24mi') dt from dual;
sql> spool &_dt
我的文件名:
27JUN2011_1727.lst
如果需要,您甚至可以指定文件扩展名(例如.txt)。只需创建另一个变量。
答案 1 :(得分:3)
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
答案 2 :(得分:2)
我认为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;