一、oracle导入单个sqly文件

公司以前都是用dmp操作数据导入导出,最近从别的地方人家给是sql文件数据库文件,不得不学习一下如何导入大文件的sql,好应对各种突发情况。

1.1、首先得会使用sqlplus连接远程数据库

sqlplus 用户名/密码@远程数据库ip:端口/实例名

1.2、连接成功之后使用导入sql文件命令

sql>@E:\areadata.sql;
sql>@/opt/oracle/area.sql;

1.3、若中文会出现乱码问题,或者报错。例如:

ERROR:
ORA-01756: quoted string not properly terminated

此时,需要排查数据库服务器的字符集和client的字符集

1.4、解决中文乱码报错

1.4.1 排查数据库服务器字符集:

sql>select userenv('language') from dual;
---AMERICAN_AMERICA.ZHS16GBK【此处的字符集是这个】

1.4.2 排查client字符集

<1> 在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK

<2> 在linux下,修改bash_profile文件

$ vi .bash_profile
NLS_LANG='AMERICAN_AMERICA.ZHS16GBK'; export NLS_LANG

这个也可能跟sql文件有关,大家可以试试设置client字符集,多试两个应该就可以了。

另外有些文件里面可能会出现一些空格之类的字符,到了sqlplus里面就会变成 ,例如下面的等待输入,往往会影响导入的时间: sql>Enter value for nbsp;

所以需要在执行sql>@E:\areadata.sql时先设置一下关闭替代变量功能 sql>set define off; 这样子就不会出现导入时等待的情况了,大大提高了导入文件的效率。

二、Oracle下命令行批量执行sql文件

有些场景下需要执行一批sql文件,sql文件非常大的时候,PL/SQL Developer无法直接执行,需要在sqlplus命令行下执行,而手工一个一个执行会很麻烦。我们可以把这些sql文件构造成一个sql文件,然后通过sqlplus命令行执行。sqlplus命令可以通过“@sql文件全路径名”执行sql文件。

2.1、第一步:创建总的sql文件

2.1.1、使用相对路径名方法

进入SQL文件目录,若用两个@@写成相对路径名这是需要进入到存放批量sql的文件夹下面,,所谓相对路径指的是相对于总sql文件。 我所有的sql文件是放在/home/oracle/sch目录下的,在此目录下创建个总sql文件如下:

$ vi /home/oracle/sch/list.sql

spool exLog.log
prompt   Start-------------------------------------------

@@BAS.sql;
@@BSC.sql;
@@DA.sql;
@@DE.sql;


prompt  end----------------------------------------------
spool off


参数说明:
A、spool 用于执行写日志信息,与spool off组合使用,如果没有spool off则不会将日志写入文件中。
B、prompt是输出信息命令。
C、@@后面添加对应的sql文件名,以分号结束。

2.1.2 使用全路径名方法

在sql文件中以“@sql文件全路径名”的方式列出所有要执行的sql文件,创建一个总sql文件 例如:创建list.sql,里面列出要执行的SQL文件名

$ vi /home/oracle/list.txt
spool exLog1.log
prompt   Start-------------------------------------------

@/home/oracle/sch/BAS.sql;
@/home/oracle/sch/BSC.sql;
@/home/oracle/sch/DA.sql;
@/home/oracle/sch/DE.sql;


prompt  end----------------------------------------------
spool off

2.2、第二步:登录sqlplus命令行,执行sql文件

调用sqlplus,进行登录和执行list.sql文件

2.2.1 相对路径进入sql文件所在目录

$ cd /home/oracle/sch
$ sqlplus username/pwd@ip/fits @list.sql

2.2.2 全路径随便哪个目录下执行命令即可执行

$ sqlplus username/pwd@ip/fits @/home/oracle/list.txt

如果是oracle服务为本机的,则可以不用ip。这个和登录sqlplus是一样的。

2.3、打印日志参数说明:

<1> spool on (开启) <2> spool c:\xx.txt (将内容保存到c:\xx.txt) <3> 执行SQL脚本 <4> spool off (关闭)