- 论坛徽章:
- 0
|
本质其实是只有一句话: DBMS_METADATA.GET_DDL( 'TABLE', u.table_name )
下面是我丰富了的功能。
读取object并解析出DDL写入文件存到UNIX上
[Typeset page]
(1) 准备工作
unix 最低权限:
chmod 010 test_xbrl_dir
d-----x--- 2 dev5ap dba 8192 Jul 6 16:37 test_xbrl_dir
建立一个directory XMLDIR
(2)实现思路: 读取object 并解析出DDL ,结果为CLOB类型. 写入文件. 存到UNIX上.
/*------------------------------------------------------------------------------
Current Version : 0.01
Create : Joodhawk Lin 06/07/2006
Purpose : out put dll
Description :
Special Input :
Output :
Demo :
Update : (1) Joodhawk, 06/07/2006
created.
------------------------------------------------------------------------------*/
PROCEDURE output_ddl
IS
v_clob CLOB;
BEGIN
SELECT DBMS_METADATA.GET_DDL( 'TABLE', u.table_name )
INTO v_clob
FROM USER_TABLES u
WHERE u.table_name = 'xx_JoodHawk_1511';
PRINTCLOBOUT(
p_filename => 'ABC.SQL',
p_result => v_clob);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(
'Error'
|| SQLERRM
|| SQLCODE );
END;
PROCEDURE PRINTCLOBOUT(
p_filename IN VARCHAR2,
p_result IN OUT NOCOPY CLOB )
IS
v_line VARCHAR2( 32767 );
v_outputfile UTL_FILE.FILE_TYPE;
v_path_name all_directories.directory_name%TYPE;
v_amount BINARY_INTEGER := 1;
v_position INTEGER := 1;
v_pattern VARCHAR2( 1 );
BEGIN
v_path_name :='XMLDIR';
DBMS_OUTPUT.put_line( v_path_name || p_filename);
v_outputfile := UTL_FILE.FOPEN( v_path_name,
p_filename,
'w' );
v_pattern := CHR( 10 );
v_amount := DBMS_LOB.INSTR( p_result,
v_pattern,
v_position,
1 ) - v_position + 1;
WHILE v_amount > 0
LOOP
DBMS_LOB.READ( p_result,
v_amount,
v_position,
v_line );
UTL_FILE.put_line( v_outputfile, v_line );
v_position := DBMS_LOB.INSTR( p_result,
v_pattern,
v_position,
1 ) + 1;
v_amount := DBMS_LOB.INSTR( p_result,
v_pattern,
v_position,
1 ) - v_position + 1;
v_line := NULL;
END LOOP;
UTL_FILE.fclose( v_outputfile );
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line( 'error: ' || SQLCODE || SQLERRM );
END;
(3)有用的点3个.
1,写文件要什么权限呢?
啥也不用,以前还搞个什么 grant权限,其实是没用的. 只要unix 上面的那个目录对Group有EXECUTE权限就ok.
2,用的oracle的package的来实现抓取 object的dll的.
3,写文件. |
|