我需要从我的所有函数,过程,包,视图和表中提取代码(脚本),这样当我转到生产时,我可以运行脚本来创建所有对象。
开发时我没有对所有数据库对象进行脚本备份。
提取代码或脚本的最佳方法是什么?任何建议或帮助都非常值得赞赏。
由于
答案 0 :(得分:6)
你确实使用版本控制系统吗?请做。
如果不能使用系统函数dbms_metadata.get_ddl
,它将返回用于创建对象的DDL的clob。这需要针对每个单独的对象进行,因此可能需要循环遍历user_objects
。
或者,您可以通过右键单击对象并使用view
选项查看PL / SQL Developer中的定义,然后在右下角可以查看用于创建对象的SQL。
还有一个export "tool",对于如何将其用作SQL Developer变体没有那么好的解释。
当然,正确的答案是获得版本控制系统并使用它。
答案 1 :(得分:1)
我不知道数据库本身,但SQL Developer会这样做。我很确定TOAD和其他类似工具也一样。
答案 2 :(得分:0)
很抱歉,您的非优化开发实践不会扩展到一个开发人员之外。
永远不要使用SQL GUI客户端'直接在数据库中编辑数据库对象的能力。 (除非你故意想制造人为问题。)
相反,所有SQL和PL / SQL DDL和DML都应位于保存到version control system(VCS)的文本文件中(例如subversion,git,mercurial) 。使用favorite editor编辑文件。
使用命令行工具(在Oracle中sqlplus
)执行VCS中保存的文本文件来修改数据库。这适用于所有数据库实例:开发,质量保证,生产。
对于大型开发项目,请考虑使用schema migration工具(例如Flyway,Roundhouse)。
多年来,我通过执行一项简单的规则,消除了大量的开发和生产问题:
如果代码不在VCS中,则它不存在。
(令人惊讶的是,仍然在2015年,很多开发团队都没有使用VCS。)
答案 3 :(得分:0)
就我而言,所有自定义对象均以“ XX”开头。您可以使用或修改我的脚本:
DECLARE
CURSOR c_tables IS
SELECT replace(object_type, ' ', '_') type,
object_name name,
owner schema,
object_type||'#'||object_name||'.sql' files
FROM all_objects
WHERE UPPER(object_name) LIKE 'XX%'
AND object_type NOT IN ('DIRECTORY');
ddl_text CLOB;
BEGIN
FOR rec_tables IN c_tables LOOP
dbms_output.put_line('OBJECT_TYPE: '||rec_tables.type||', OBJECT_NAME: '||rec_tables.name||', SCHEMA: '||rec_tables.schema||' ->'||rec_tables.files);
SELECT dbms_metadata.get_ddl(rec_tables.type, rec_tables.name, rec_tables.schema)
INTO ddl_text
FROM DUAL;
dbms_xslprocessor.clob2file(ddl_text, 'UTL_CUSTOM_DDL', rec_tables.files, nls_charset_id('WE8MSWIN1252'));
END LOOP;
END;
致谢