最近用到的,因为plsql是收费的,不让用,找了很多方法终于发现了这个。
核心语句
1
2
3
4
5
6
7
8
9
|
SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, U.object_name), U.OBJECT_TYPE
FROM USER_OBJECTS U
where U.OBJECT_TYPE = 'TABLE'
or U.OBJECT_TYPE = 'VIEW'
or U.OBJECT_TYPE = 'INDEX'
or U.OBJECT_TYPE = 'PROCEDURE'
or U.OBJECT_TYPE = 'SEQUENCE'
or U.OBJECT_TYPE = 'TRIGGER'
order by U.OBJECT_TYPE desc
|
自己写的Java方法,未做封装。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
package sql;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class Main {
private static final String TYPE_MARK = "-1" ;
private static String SQL =
"SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, U.object_name), U.OBJECT_TYPE " +
"FROM USER_OBJECTS U " +
"where U.OBJECT_TYPE = 'TABLE' " +
"or U.OBJECT_TYPE = 'VIEW' " +
"or U.OBJECT_TYPE = 'INDEX' " +
"or U.OBJECT_TYPE = 'PROCEDURE' " +
"or U.OBJECT_TYPE = 'SEQUENCE' " +
"or U.OBJECT_TYPE = 'TRIGGER' " +
"order by U.OBJECT_TYPE desc" ;
private static String URL = "jdbc:oracle:thin:@192.168.1.2:1521:orcl" ;
private static String USERNAME = "abc" ;
private static String PASSWORD = "abc" ;
private static String OUTFILE = "tables.sql" ;
/**
* @param args
* @throws Exception
* @throws
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Properties properties = new Properties();
properties.load( new FileInputStream( "config.properties" ));
URL = properties.getProperty( "url" , URL);
USERNAME = properties.getProperty( "username" , USERNAME);
PASSWORD = properties.getProperty( "password" , PASSWORD);
OUTFILE = properties.getProperty( "outfile" , OUTFILE);
SQL = properties.getProperty( "sql" , SQL);
FileWriter fw = new FileWriter(OUTFILE);
Class.forName( "oracle.jdbc.driver.OracleDriver" );
Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
Statement statement = con.createStatement();
ResultSet rs = statement.executeQuery(SQL);
Clob ddl;
String type = TYPE_MARK;
int count = 0 ;
List<String> list = new ArrayList<String>();
while (rs.next()) {
ddl = rs.getClob( 1 );
fw.write(ddl.getSubString(1L, ( int )ddl.length()));
if (!rs.getString( 2 ).equals(type)) {
if (!type.equals(TYPE_MARK)) {
list.add(type + "," + count);
type = rs.getString( 2 );
count = 1 ;
} else {
type = rs.getString( 2 );
count ++;
}
} else
count ++;
}
list.add(type + "," + count);
fw.flush();
fw.close();
rs.close();
statement.close();
con.close();
for (String type1 : list)
System.out.print(type1.split( "," )[ 0 ] + ":" + type1.split( "," )[ 1 ] + ";" );
System.out.println();
}
}
|
config.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
|
url=jdbc:oracle:thin: @192 .168. 1.2 : 1521 :orcl
username=abc
password=abc
outfile=tables.sql
sql=SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, U.object_name), U.OBJECT_TYPE \
FROM USER_OBJECTS U \
where U.OBJECT_TYPE = 'TABLE' \
or U.OBJECT_TYPE = 'VIEW' \
or U.OBJECT_TYPE = 'INDEX' \
or U.OBJECT_TYPE = 'PROCEDURE' \
or U.OBJECT_TYPE = 'SEQUENCE' \
or U.OBJECT_TYPE = 'TRIGGER' \
order by U.OBJECT_TYPE desc
|
另外需要jdbc的Oracle驱动。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!