Oracle转Mysql建表脚本

–Oracle转mysql建表脚本
SELECT
t.column_id,
‘edi_’ || t.table_name AS table_name,
CASE

	WHEN t1.table_name IS NOT NULL THEN
	REPLACE (
		t.ddl_sql,
		',',
		');' 
) ELSE t.ddl_sql 

END AS ddl_sql
FROM
(–拼接建表语句
SELECT
column_id,
table_name,
lower(
CASE

			WHEN nullable = 'N' THEN
			column_name || ' ' || column_type_new || ' NOT NULL COMMENT ' || '''' || column_comments || ''',' ELSE column_name || ' ' || column_type_new || ' COMMENT ' || '''' || column_comments || ''',' 
		END 
		) AS ddl_sql 
	FROM
		(---Oracle转mysql
		SELECT
			lower(
			CASE
					WHEN column_type  in('VARCHAR2(2000)','VARCHAR2(4000)') THEN
					'text' 
					WHEN column_type LIKE '%FLOAT%' 
					AND data_precision > 64 THEN
						'decimal(64)' 
						WHEN column_type LIKE '%FLOAT%' 
						AND data_precision <= 64 THEN
							REPLACE (
								column_type,
								'FLOAT',
								'decimal' 
							) 
							WHEN column_type = 'TIMESTAMP(6)(11)' THEN
							'timestamp(6)' 
							WHEN column_type LIKE '%CHAR%' THEN
							REPLACE (
								REPLACE (
									column_type,
									'NVARCHAR2',
									'VARCHAR' 
								),
								'VARCHAR2',
								'VARCHAR' 
							) 
							WHEN column_type = 'NUMBER(22)' THEN
							'bigint' 
							WHEN (
								column_type LIKE '%NUMBER%,0%' 
								OR column_type LIKE '%FLOAT%' 
							) 
							AND data_precision > 10 THEN
								REPLACE (
									REPLACE (
										column_type,
										'NUMBER',
										'bigint' 
									),
									',0',
									'' 
								) 
								WHEN column_type LIKE '%NUMBER%,0%' 
								AND data_precision <= 10 THEN
									REPLACE (
										REPLACE (
											column_type,
											'NUMBER',
											'int' 
										),
										',0',
										'' 
									) 
									WHEN column_type LIKE '%NUMBER%' 
									AND column_type NOT LIKE '%NUMBER,0%' THEN
										REPLACE (
											column_type,
											'NUMBER',
											'decimal' 
										) 
										WHEN column_type = 'DATE(7)' THEN
										'datetime(0)' ELSE column_type 
									END 
									) AS column_type_new,
									column_id,
									table_name,
									table_comments,
									column_name,
									column_comments,
									data_type,
									data_length,
									data_precision,
									data_scale,
									nullable 
								FROM
									(--oracle字段拼接
									SELECT
										t2.column_id,
										t.table_name,
										t1.comments AS table_comments,
										t2.column_name,
										REPLACE (
											t3.comments,
											'''',
											'' 
										) AS column_comments,
										data_type || '(' ||
										CASE--number类型特殊处理
											
											WHEN data_type NOT IN (
												'NUMBER',
												'FLOAT' 
												) THEN
												DATA_LENGTH || (
												CASE
														
														WHEN data_precision IS NOT NULL THEN
														',' || data_precision || ')' ELSE ')' 
													END 
													) ELSE
												CASE
														
														WHEN data_precision IS NOT NULL THEN
														data_precision || (
														CASE
																
																WHEN data_scale IS NOT NULL THEN
																',' || data_scale || ')' ELSE ')' 
															END 
																) ELSE DATA_LENGTH || (
															CASE
																	
																	WHEN data_precision IS NOT NULL THEN
																	',' || data_precision || ')' ELSE ')' 
																END 
																) 
															END 
															END AS column_type,
															data_type,
															data_length,
															data_precision,
															data_scale,
															nullable 
														FROM
															user_tables t
															INNER JOIN user_tab_comments t1 ON t.table_name = t1.table_name
															INNER JOIN user_tab_columns t2 ON t.table_name = t2.table_name
															INNER JOIN user_col_comments t3 ON t.table_name = t3.table_name 
															AND t2.column_name = t3.column_name 
														WHERE
															t.table_name IN (
																'TEST'
															) 
														) n 
													) m UNION ALL
												SELECT
													0 AS column_id,
													table_name,
													lower(
														'CREATE TABLE edi_' || table_name || '(' 
													) AS ddl_sql 
												FROM
													user_tables 
												WHERE
													table_name IN (
															'TEST'
													) 
												) t
												LEFT JOIN (
												SELECT
													table_name,
													max(
														column_id 
													) AS column_id 
												FROM
													user_tab_columns 
												GROUP BY
													table_name 
												) t1 ON t.table_name = t1.table_name 
												AND t.column_id = t1.column_id 
											ORDER BY
												t.table_name,
												t.column_id;

–索引
SELECT
m.index_name,
lower(
CASE

		WHEN m.uniqueness = 'UNIQUE' THEN
		'CREATE UNIQUE INDEX ' || m.index_name || ' ON edi_' || m.table_name || '(' || m.column_name || ')' ELSE 'CREATE INDEX ' || m.index_name || ' ON edi_' || m.table_name || '(' || m.column_name || ')' 
	END 
	) || ';' AS create_index 
FROM
	(
	SELECT
		t.index_name,
		t.table_name,
		t.uniqueness,
		wm_concat (
			t1.column_name 
		) AS column_name 
	FROM
		user_indexes t
		INNER JOIN user_ind_columns t1 ON t.table_name = t1.table_name 
		AND t.index_name = t1.index_name 
	WHERE
		t.table_name IN (
				'TEST'
		) 
	GROUP BY
		t.index_name,
		t.table_name,
	t.uniqueness 
) m;

你可能感兴趣的:(笔记,oracle,mysql,android)