SQLserver写Oracle,Oracle拉出在sqlserver建表的语句

我们将Oracle数据同步到sqlserver时,是先得在sqlserver端建表的。

复杂的字段我们不同步,就仅仅考虑以下四种数据类型。

Oracle到SQLServer做的映射:

int -> int

number -> decimal(18,6)

number(p,s) -> decimal(p,s)

date -> datetime

varchar2(n) -> nvarchar(n)

以下是从Oracle端运行的plsql脚本。

/*

简单介绍:从oracle拉出在mssql建表的脚本。

这是用PLSQL语言写成的,在Oracle中运行的脚本。

例如以下是取出BOM属主下的非暂时表。

作者:DBA_白老大

最后更新日期:20140515

*/

/*

Oracle到SQLServer做的映射:

int -> int

number -> decimal(18,6)

number(p,s) -> decimal(p,s)

date -> datetime

varchar2(n) -> nvarchar(n)

*/

declare

v_column_name VARCHAR2(30);

v_data_type VARCHAR2(106);

v_data_length number;

v_DATA_PRECISION number;

v_DATA_SCALE number;

v_cnt int;

begin

for i in (

SELECT 'GGMGR' AS OWNER, 'T6' AS table_name FROM DUAL UNION

SELECT 'GGMGR' AS OWNER, 'T2' AS table_name FROM DUAL UNION

SELECT 'GGMGR' AS OWNER, 'T6' AS table_name FROM DUAL

)

loop

dbms_output.put_line('create table '||'erp'||'.'||'dbo.'||i.table_name||'(');

select count(*)

into v_cnt

from dba_tab_columns

where table_name = i.table_name

and owner = i.owner;

for b in 1 .. v_cnt loop

select COLUMN_NAME,

data_type,

data_length,

data_precision,

data_scale

into v_column_name,

v_data_type,

v_data_length,

v_DATA_PRECISION,

v_DATA_SCALE

from dba_tab_columns t

where table_name = i.table_name

and owner = i.owner

and column_id = b;

--INT

IF v_data_type = 'NUMBER' and v_DATA_PRECISION is null and b != v_cnt THEN

dbms_output.put_line(v_column_name||'  decimal'||',');

END IF;

IF v_data_type = 'NUMBER' and v_DATA_PRECISION is null and b = v_cnt THEN

dbms_output.put_line(v_column_name||'  decimal');

END IF;

--NUMBER

IF (v_data_type = 'NUMBER')  and (v_DATA_PRECISION is not null) and (b != v_cnt) THEN

dbms_output.put_line(v_column_name||'  decimal'||'('||v_data_precision||','||v_data_scale||'),');

END IF;

IF (v_data_type = 'NUMBER') and (v_DATA_PRECISION is not null) and (b = v_cnt) THEN

dbms_output.put_line(v_column_name||'  decimal'||'('||v_data_precision||','||v_data_scale||')');

END IF;

--varchar2

IF (v_data_type = 'VARCHAR2')  and (v_DATA_length is not null) and (b != v_cnt) THEN

dbms_output.put_line(v_column_name||'  nvarchar'||'('||v_data_length||'),');

END IF;

IF (v_data_type = 'VARCHAR2')  and (v_DATA_length is not null) and (b = v_cnt) THEN

dbms_output.put_line(v_column_name||'  nvarchar'||'('||v_data_length||')');

END IF;

--date

IF (v_data_type = 'DATE') and (b != v_cnt) THEN

dbms_output.put_line(v_column_name||'  DATETIME,');

END IF;

IF (v_data_type = 'DATE') and (b = v_cnt) THEN

dbms_output.put_line(v_column_name||'  DATETIME');

END IF;

--不属于INT,NUMBER,DATE,VARCHAR2

IF (v_column_name != 'NUMBER')  and (v_column_name != 'DATE') and (v_column_name != 'VARCHAR2')  THEN

null;

END IF;

end loop;

dbms_output.put_line(');'||chr(10));

end loop;

end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值