我是新手,对oracle不熟悉,原来都是通过imp/exp 做导入导出。现在遇到难题了:客户那边不允许使用imp/exp 做导入导出,只能使用脚本导入和导出,我这边只有SQLPLUS,使用它只能一个表一个表导出创建表的脚本,而且还带了用户和表空间什么的信息,
有没有可以一次性把表空间下所有表的创建表的脚本生成的?包括关键字、索引和触发器等等的?因为导出时带了这些信息,导入时表空间和用户更换了,就会导入失败的!2,表里的数据能不能一次性导出脚本的?主要是我们的表非常多,而且之间数据有些关联,插入数据还有先后的,没有什么工具可以一次性生成这些脚本的?然后能保证我导入就可以一次性执行的?这两个问题很急,老板又催,大侠给个解决方案吧!!!!

解决方案 »

  1.   

    可以考虑使用 oracle sql developer,反正免安装的,拷贝过去就可以用1、设置导出分隔符
    工具--首选项--数据库--卸载/查看DDL选项--带分隔符的格式
    左、右定界符由双引号改为单引号2、导出表格
    选择表格(可单一表格, 也可多个表格)--右键点击--卸载(这里中文版翻译有问题,实际为export)
    可以生成.sql的文件,这个文件中包括表结构的DDL语句,和数据。
    然后打开这个文件,替换掉与用户名和表空间相关的字符,在最后一行加(COMMIT;),就算完成了。
      

  2.   

    你可以写一个shell脚本:#!/usr/bin/ksh
    #作者:
    ######################################################################
    #初始化配置信息
    ######################################################################
    func_init(){
    workdir=`pwd`
    log_path="${workdir}/log"
    cfgfile="${workdir}/cfg/baseinf.cfg"
    downloadlogfile="${Workdir}/${log_path}/download.log"

    src="${workdir}/src"

    if [ ! -d ${log_path} ]; then
    mkdir -p ${log_path}
    fi echo "" > ${downloadlogfile}

    if [ ! -f ${logfile} ]; then
    touch ${logfile}
    fi

    if [ ! -d ${src} ];then
    mkdir -p ${src}
    fi

    rm -rf ${src}/*
    }
    ######################################################################
    #DESC : 记录日志
    #USAGE: Log "content"
    ######################################################################Sublog()
    {
        echo "[ `date '+%Y%m%d %H:%M:%S'` ] $*" | tee -a ${downloadlogfile}
    }
    ######################################################################
    #DESC : 得到配置文件信息
    #USAGE: 
    ######################################################################
    GetCfg()
    {
        if [ $# -ne 3 ];then
            print "Error!!Get config value failed!!($*)"
            return 1
        fi
        
        tmpCfgFile="$1"
        tmpKey="$2"
        tmpValue=`cat ${tmpCfgFile}|grep "${tmpKey}"|grep -v "\["|head -n 1|awk -F "#" '{ print $1 }'|awk -F "=" '{ print $2 }'|tr -d " \t\n\r"`
        eval $3="${tmpValue}"
        return 0
    }######################################################################
    #DESC : 通过给出的表名下载数据库中相同表名的数据
    #USAGE: 
    ######################################################################
    f_getsql()
    {
        fields=""
    fields2=""
    lv_line_num=`cat ${workdir}/cfg/mem_tabStructure/$tablename.unl | wc -l`
    lv_index=0

    while read field
    do
    lv_index=`expr ${lv_index} + 1`
    if [ ${lv_index} -eq ${lv_line_num} ]; then
    fields=${fields}${field}"||""'|'"
    fields2=${fields2}${field}
    else
    fields=${fields}${field}"||""'|'""||"
    fields2=${fields2}${field}","
    fi
    done < ${workdir}/cfg/mem_tabStructure/$tablename.unl

    sql="select "${fields}" from ${tablename} "}######################################################################
    #DESC : 文件下载
    #USAGE: 
    ######################################################################
    func_manage(){
    GetCfg $cfgfile "DBNAME" dbname
    GetCfg $cfgfile "DBTYPE" dbtype
    GetCfg $cfgfile "TABFILE" tablelist
    dbtype=`echo $dbtype|tr "[:upper:]" "[:lower:]"` Sublog "=== begin download table from ${dbtype} phydb ==="
    Sublog "DataBase : ${dbname}" for tablename in `cat ${workdir}/cfg/$tablelist`
    do
    Sublog "begin download $tablename..."
    f_getsql
    sqlplus -s ${dbname} > /dev/null <<!
    set serveroutput on
    set feedback off
    set trims on
    set pagesize 0
    set timing off
    set lin 5000
    alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
    spool src/$tablename.unl
    $sql;
    spool off
    set serveroutput off
    !
    if [ "$?" -ne 0 ]; then
    Sublog "download table ${tablename} failed!!!!!!!!!!!!!!!!!!"
    else
    Sublog "download table ${tablename} successfully"
    fi

    Sublog ""
    done

    }main(){
    #初始化环境
    func_init
    #处理文件
    func_manage

    }main
    这是我写过的一个,你只要在baseinf.cfg中配置DBNAME=ocs_mig/ocs_mig@userdb(根据你要的改)
    tablelist.list配置你要下载的表名就ok
      

  3.   

    对了,上面的那个是内存库的,物理库的只要改下面部分就好:
    f_getsql()
    {
                  
            sqlplus  -s ${dbname} >/dev/null <<!
    spool sql_temp_$tablename.txt;
    select column_name from user_tab_columns where table_name= upper('${tablename}') order by column_id;
    spool off;
    exit
    !
            if [ -f sql_temp_$tablename.txt ]; then
    cat sql_temp_$tablename.txt|grep -v "COLUMN_NAME" |grep -v " *-" |grep -v " rows selected" |awk '{print $1}' > sql_temp1_$tablename.txt
    sed -e '/^[[:space:]]*$/d' sql_temp1_$tablename.txt > sql_temp2_$tablename.txt
    else
    Sublog "Error :get the column of $tablename failed!"
    exit
    fi

    fields=""
    fields2=""
    lv_line_num=`cat sql_temp2_$tablename.txt | wc -l`
    lv_index=0

    while read field
    do
    lv_index=`expr ${lv_index} + 1`
    if [ ${lv_index} -eq ${lv_line_num} ]; then
    fields=${fields}${field}"||""'|'"
    fields2=${fields2}${field}
    else
    fields=${fields}${field}"||""'|'""||"
    fields2=${fields2}${field}","
    fi
    done < sql_temp2_$tablename.txt

    sql="select "${fields}" from ${tablename} "
    echo $sql
    echo "---sql"
    #rm sql_temp_$tablename.txt sql_temp1_$tablename.txt sql_temp2_$tablename.txt
    }
      

  4.   

    TOAD一连接,自动生成,用工具吧,支持导出导入