簡單的反向生產DDL語句的指令碼
DECLARE
v_ddlsql VARCHAR2(32767);
BEGIN
FOR rec IN (SELECT * FROM user_tables WHERE table_name = 'T2') LOOP
v_ddlsql := 'create table ' || rec.table_name || '(';
FOR cols IN (SELECT *
FROM user_tab_cols c
WHERE c.table_name = rec.table_name
ORDER BY c.column_id) LOOP
v_ddlsql := v_ddlsql || ' ' || cols.column_name;
IF cols.data_type = 'VARCHAR2' THEN
IF cols.char_used = 'B' THEN
v_ddlsql := v_ddlsql || ' varchar2(' || cols.data_length || ')';
ELSE
v_ddlsql := v_ddlsql || ' varchar2(' || cols.char_length ||
' char)';
END IF;
ELSIF cols.data_type = 'NUMBER' THEN
IF cols.data_precision IS NOT NULL THEN
v_ddlsql := v_ddlsql || ' number(' || cols.data_precision || ',' ||
cols.data_scale || ')';
ELSE
v_ddlsql := v_ddlsql || ' number(38,0)';
END IF;
ELSIF cols.data_type = 'BLOB' THEN
v_ddlsql := v_ddlsql || ' blob ';
ELSIF cols.data_type = 'CLOB' THEN
v_ddlsql := v_ddlsql || ' clob ';
ELSIF cols.data_type = 'DATE' THEN
v_ddlsql := v_ddlsql || ' date ';
END IF;
IF cols.data_default IS NOT NULL THEN
v_ddlsql := v_ddlsql || ' default ' || cols.data_default;
END IF;
IF cols.nullable = 'N' THEN
v_ddlsql := v_ddlsql || ' not null ';
END IF;
v_ddlsql := v_ddlsql || ',' || chr(10);
END LOOP;
--處理約束
FOR rec_cons IN (SELECT uc.constraint_name,
decode(uc.constraint_type,
'C',
'check',
'P',
'primary key',
'U',
'unique') constraint_type,
uc.table_name,
uc.search_condition search_condition
FROM user_constraints uc
WHERE uc.table_name = rec.table_name
AND uc.constraint_name NOT LIKE 'SYS%') LOOP
v_ddlsql := v_ddlsql || ' constraint ' || rec_cons.constraint_name || ' ' ||
rec_cons.constraint_type;
IF rec_cons.constraint_type = 'check' THEN
v_ddlsql := v_ddlsql || ' (' || rec_cons.search_condition || '),' ||
chr(10);
ELSE
v_ddlsql := v_ddlsql || ' (';
FOR rec_cons_cols IN (SELECT *
FROM user_cons_columns s
WHERE s.constraint_name =
rec_cons.constraint_name
ORDER BY s.position) LOOP
v_ddlsql := v_ddlsql || rec_cons_cols.column_name || ',';
END LOOP;
v_ddlsql := substr(v_ddlsql, 1, length(v_ddlsql) - 1);
v_ddlsql := v_ddlsql || ') using index,' || chr(10);
END IF;
END LOOP;
v_ddlsql := substr(v_ddlsql, 1, length(v_ddlsql) - 2);
v_ddlsql := v_ddlsql || ');' || chr(10);
--處理索引
FOR rec_index IN (SELECT *
FROM user_indexes ind
WHERE ind.table_name = rec.table_name
AND ind.index_name NOT LIKE 'SYS%'
AND ind.uniqueness <> 'UNIQUE') LOOP
v_ddlsql := v_ddlsql || 'create index ' || rec_index.index_name ||
' on ' || rec.table_name || '(';
FOR rec_index_cols IN (SELECT *
FROM user_ind_columns uic
WHERE uic.table_name = rec.table_name
AND uic.index_name = rec_index.index_name
ORDER BY uic.column_position) LOOP
v_ddlsql := v_ddlsql || rec_index_cols.column_name || ',';
END LOOP;
v_ddlsql := substr(v_ddlsql, 1, length(v_ddlsql) - 1);
v_ddlsql := v_ddlsql || ');' || chr(10);
END LOOP;
dbms_output.put_line(v_ddlsql);
END LOOP;
END;
測試:
create table t2(
a number not null,
b varchar2(40),
c date default sysdate not null ,
d varchar2(10 char),
e clob,
f blob
)
alter table t2 add constraint pk_t2 primary key (a) using index;
create index t2_index1 on t2(b,c);
程式碼輸出:
create table T2( A number(38,0) not null ,
B varchar2(40),
C date default sysdate not null ,
D varchar2(10 char),
E clob ,
F blob ,
constraint PK_T2 primary key (A) using index);
create index T2_INDEX1 on T2(B,C);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8520577/viewspace-773969/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【C/C++】ghost ddl指令碼簡單實現C++指令碼
- 使用動態SQL語句實現簡單的行列轉置(動態產生列)SQL
- 產生Statspack快照的Shell指令碼指令碼
- Shell 指令碼語句指令碼
- 獲取物件DDL語句的方法物件
- 簡單的SQL語句學習SQL
- MySQL的簡單查詢語句MySql
- 一條簡單SQL語句的構成及語句解析SQL
- oracle檢視建立物件的DDL語句Oracle物件
- 簡單使用oracle的審計語句Oracle
- 【Mysql】兩條insert 語句產生的死鎖MySql
- 獲取單個檢視DDL指令碼指令碼
- 《shell指令碼if..then..elif..then.if語句的總結》指令碼
- 指令碼:監控當前活動的語句指令碼
- Oracle 獲取ddl語句Oracle
- PL/SQL與DDL語句SQL
- 一句簡單的SQL查詢語句的背後...SQL
- Oracle中獲取TABLE的DDL語句的方法Oracle
- 日誌挖掘-對於DDL語句的挖掘
- Oracle 儲存過程中的DDL語句Oracle儲存過程
- 報錯的語句也可以產生執行計劃
- mysql簡單的碎片清理指令碼MySql指令碼
- 簡單的FTP Donwload 指令碼FTP指令碼
- Shell指令碼之for迴圈語句的應用指令碼
- 監控使用高cpu的sql語句指令碼SQL指令碼
- 批量生成DDL指令碼指令碼
- 執行oracle DDL語句要注意的問題Oracle
- 最簡單的一個powershell的指令碼指令碼
- ORACLE DBA常用語句和指令碼Oracle指令碼
- 記錄一個防止DDL的指令碼指令碼
- Nginx反向代理的簡單實現Nginx
- 根據快照產生statpack報表的Shell指令碼指令碼
- 簡單的 Shell 指令碼入門教程指令碼
- redis中lua指令碼的簡單使用Redis指令碼
- 【python】簡單的備份指令碼Python指令碼
- 利用dbms_metadata.get_ddl檢視DDL語句
- 用dbms_metadata.get_ddl獲取ddl語句
- 使用DBMS_METADATA.GET_DDL獲取物件的DDL指令碼物件指令碼