Hi Yujun,
I just played around on creating the below procedure which returns the 'Create Table' script. I haven't considered the constraints/indexes part on this. Also there might be missing in data type considerations.Can you please have a look on this.. Not sure whether this is helpful or not.
DROP PROCEDURE GET_TABLE_DEFINITION_SP;
CREATE PROCEDURE GET_TABLE_DEFINITION_SP(IN _schema_name NVARCHAR(256), IN _table_name NVARCHAR(256), OUT _tab_def NCLOB,OUT _comment_def NCLOB)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
-- DEFAULT SCHEMA
AS
BEGIN
DECLARE is_exist TINYINT;
DECLARE table_type VARCHAR(10);
DECLARE init_create VARCHAR(400);
DECLARE tab_cols NCLOB;
DECLARE col_comment NCLOB;
DECLARE CURSOR cur_tab_cols FOR
SELECT t.COLUMN_NAME,t.DATA_TYPE_NAME,t.LENGTH AS COL_LENGTH,t.SCALE AS COL_SCALE,t.IS_NULLABLE,t.DEFAULT_VALUE,t.COMMENTS,t.CS_DATA_TYPE_NAME
FROM SYS.TABLE_COLUMNS t
WHERE t.SCHEMA_NAME = _schema_name AND t.TABLE_NAME = _table_name
ORDER BY POSITION;
SELECT COUNT(1),MAX(TABLE_TYPE) INTO is_exist,table_type FROM SYS.TABLES WHERE SCHEMA_NAME = _schema_name AND TABLE_NAME = _table_name;
IF is_exist = 0 THEN
_tab_def := ' table not found ';
RETURN;
END IF;
init_create := 'CREATE ' || :table_type || ' TABLE "' || :_schema_name || '"."' || :_table_name || '" (';
FOR cur_tab_cols_rec AS cur_tab_cols DO
tab_cols := CASE WHEN cur_tab_cols::ROWCOUNT = 1 THEN TO_CHAR('') ELSE TO_CHAR(tab_cols) || TO_CHAR(',') END ||
'"'|| cur_tab_cols_rec.COLUMN_NAME || '"' || ' ' || cur_tab_cols_rec.DATA_TYPE_NAME ||
CASE WHEN cur_tab_cols_rec.DATA_TYPE_NAME = 'NVARCHAR' OR
cur_tab_cols_rec.DATA_TYPE_NAME = 'VARCHAR' OR
cur_tab_cols_rec.DATA_TYPE_NAME = 'CHAR' OR
cur_tab_cols_rec.DATA_TYPE_NAME = 'SHORTTEXT' OR
cur_tab_cols_rec.DATA_TYPE_NAME = 'ALPHANUM' OR
cur_tab_cols_rec.DATA_TYPE_NAME = 'VARBINARY' OR
cur_tab_cols_rec.DATA_TYPE_NAME = 'BINARY'
THEN '(' || TO_CHAR(cur_tab_cols_rec."COL_LENGTH") || ')'
WHEN cur_tab_cols_rec.DATA_TYPE_NAME = 'DECIMAL'
THEN '(' || TO_CHAR(cur_tab_cols_rec."COL_LENGTH") || ',' || TO_CHAR(cur_tab_cols_rec.COL_SCALE) || ')'
ELSE ''
END ||
CASE WHEN cur_tab_cols_rec.IS_NULLABLE = 'FALSE' THEN ' NOT NULL ' ELSE '' END ||
CASE WHEN cur_tab_cols_rec.DEFAULT_VALUE IS NOT NULL THEN ' DEFAULT ' ||
CASE WHEN cur_tab_cols_rec.DATA_TYPE_NAME = 'NVARCHAR' OR
cur_tab_cols_rec.DATA_TYPE_NAME = 'VARCHAR' OR
cur_tab_cols_rec.DATA_TYPE_NAME = 'CHAR' OR
cur_tab_cols_rec.DATA_TYPE_NAME = 'SHORTTEXT' OR
cur_tab_cols_rec.DATA_TYPE_NAME = 'ALPHANUM' THEN '''' || cur_tab_cols_rec.DEFAULT_VALUE || ''''
ELSE cur_tab_cols_rec.DEFAULT_VALUE END
ELSE ''
END;
col_comment := IFNULL(TO_CHAR(col_comment),TO_CHAR('')) ||
CASE WHEN cur_tab_cols_rec.COMMENTS IS NULL THEN ''
ELSE
'COMMENT ON COLUMN ' || '"' || :_schema_name || '".' || '"' || :_table_name || '"."' || cur_tab_cols_rec.COLUMN_NAME || '" IS ' ||
'''' || cur_tab_cols_rec.COMMENTS || '''' || ';'
END ;
END FOR;
_tab_def := init_create || ' ' || tab_cols || ' );' ;
_comment_def := col_comment;
END;
CALL GET_TABLE_DEFINITION_SP('schema_name','table_name',?,?) ;
Regards,
Nithin