我们将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;

Oracle拉出在sqlserver建表的语句的更多相关文章

  1. Oracle获取干净的建表DDL语句,不含其它存储、表空间、段属性

    早上一个同事资讯怎么获取到建表语句而且是不带存储那种SQL.Oracle自己提供了一个函数DBMS_METADATA.GET_DDL,但是获取到的建表语句含有存储.表空间.以及一些其他段的属性.如图: ...

  2. 抓取oracle建表语句及获取建表ddl语句

    抓取oracle建表语句及获取建表ddl语句 1.抓取代码如下: 1.1.产生表的语法资料 DECLARE-- v_notPartTable VARCHAR2(1000):= '&2'; -- ...

  3. Oracle 自动生成hive建表语句

    从 oracle 数据库导数到到 hive 大数据平台,需要按照大数据平台的数据规范,重新生成建表的 SQL 语句,方便其间,写了一个自动生成SQL的存储过程. ① 创建一张表,用来存储源表的结构,以 ...

  4. oracle之 获取建表ddl语句

    第一种方法是使用工具,如:pl/sql developer,在[工具]--[导出用户对象]出现就可以得到建表脚本. 第二种方法是,sql语句. DBMS_METADATA.GET_DDL包可以得到数据 ...

  5. 1-基本建表sql语句

    基本的建表语句的总结 --建表语法 CREATE TABLE 表名( --约束可以没有 列名1 数据类型 [约束], 列名2 数据类型 [约束], ......, [约束], ..... ); --该 ...

  6. [04] 利用注解生成实体类对应的建表sql语句

    1.实现功能 我们已经对注解有了基本的认识,知道了如何自定义注解,如何使用和最基本的处理注解. 本篇主要介绍,如何使用运行时级别的注解,配合反射来自动生成建表的sql语句.如下例: 我们有实体类Stu ...

  7. sqlserver 建表语句,获取建表语句的存储过程,包括排序规则,索引,字段说明,支持同时生成多个表

    先创建一个分割表名的分割函数 --表值函数用以截取字符串 --如果为其添加一列主键id,则其顺序就会固定了 create FUNCTION [Split](@text NVARCHAR(max)) ) ...

  8. 获取oracle的建表DLL语句

    get_ddl('TABLE','表名','实例名') from dual   select dbms_metadata.get_ddl('TABLE','RMS_CITY','RMS') from ...

  9. Oracle 12c 建表空间语句

    create tablespace TBS_DYS datafile 'D:/Oracle_12c/app/dingyingsi/oradata/dingyingsi/TBS_DYS.ba' size ...

随机推荐

  1. 介绍Visual Studio的Android模拟器

    介绍Visual Studio的Android模拟器 http://blogs.msdn.com/b/visualstudioalm/archive/2014/11/12/introducing-vi ...

  2. C经典之9-system,if,do,while---ShinePans

    #include <stdio.h> #include <conio.h> #include <stdlib.h> //system(); 这个指令须要用到此头文件 ...

  3. C#应用视频教程1.2 Socket通信客户端实现

    接下来我们尝试实现最简单的Socket客户端,为了确保只可能你的代码有问题,服务器要先用别人成熟的代码测试(这也是编程的一个技巧,先不要用自己写的客户端测试自己写的服务器,这样出了问题你也不知道谁有问 ...

  4. 算法笔记_136:交替字符串(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 输入三个字符串s1.s2和s3,判断第三个字符串s3是否由前两个字符串s1和s2交错而成且不改变s1和s2中各个字符原有的相对顺序. 2 解决方案 ...

  5. leetCode(29):Happy Number

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  6. 【VBA】点击工作簿中的每个单元格,整行整列变色

    需求描述 在点击单元格的时候,单元格所在行与列都变色显示 实现方案 打开Excle表格,按住ALT+F11 双击上图中的ThisWorkbook Private Sub Workbook_SheetS ...

  7. 【Oracle】PL/SQL Developer 快捷键、使用技巧

    1.类SQL PLUS窗口:File->New->Command Window,这个类似于oracle的客户端工具sql plus,但比它好用多了. 2.设置关键字自动大写:Tools-& ...

  8. iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)

    简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...

  9. 【LeetCode】78. Subsets (2 solutions)

    Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ...

  10. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第10章节--SP2013中OAuth概览 应用程序验证

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第10章节--SP2013中OAuth概览  应用程序验证 既然你懂得了什么是应用程序身份.而且知道怎样在SP中创建和设置 ...