Oracle导入导出文本数据
表结构
-- Create table
create table STUDENT
(
SNO NUMBER,
NAME VARCHAR2(12)
)
1. spool导出数据的使用
使用spool命令导出数据
--sp.sql
set echo off
set trimspool on
set linesize 900
set pagesize 200
set heading off
set feedback off
set term off
spool data.txt
select sno||','||name from student ;
spool off
/
E:/test>sqlplus sun/sun
SQL> @sp
--data.txt
1,李雷
2. sqlldr导入数据的使用
把in.txt 中的数据导入到表student中
Load.ctl
LOAD DATA
INFILE 'in.txt'
append INTO TABLE student
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(
name,
FILLER_1 FILLER, -- 过滤
sno
-- EFF_DATE date "yyyy-mm-dd hh24:mi:ss" 日期格式
)
select * from student
SNO NAME
1 李雷
在命令行中执行
E:/test>sqlldr sun/sun control=load.ctl
SQL*Loader: Release 11.1.0.6.0 - Production on 星期三 5月 12 15:24:42 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
达到提交点 - 逻辑记录计数 1
达到提交点 - 逻辑记录计数 2
E:/test>
in.txt
韩美美,hmm,2
Mary,mm,3
select * from student;
SNO NAME
1 李雷
2 韩美美
3 Mary
实现了数据的插入,以及字段的过滤,字段的对应顺序
----------
安装数据库 dbname test
安装有问题
新建数据库,sqlnet.ora中注释#SQLNET.AUTHENTICATION_SERVICES= (NTS)
tnsping test
发现是环境变量path有问题,修改
oci程序,添加include,添加lib
#if defined(WIN32)
#pragma comment(lib,"oci.lib")
#endif
8-30
------
9-1
头文件问题
text * sql = (text*)"insert into part_nos values(:description,:partno)";
obndra
ORA-01484: 数组仅可以与 PL/SQL 语句关联
processing oci function OEXEC, OEXN
-------
9-3
封装
初步实现绑定数据批量插数据到数据库
---
9-7
由于是常驻进程,注意检查数据库的连接状态,在连接断开时,可以再次连接
----
9-8
进行查询的时候,整型若为NULL,取其值则为0
-----
9-16
INSTALL_PATH = /home/gmdb/database/gmdb
使用GMDB,在makefile中调用提供的库就可以了,注意看其用法
利用客户端查看结果
可以创建索引,对索引的功效进行测试验证
9-19
GMDB的一些问题
delete的时候不需要显式的commit就可以提交,update的时候需要
直接在客户端进行rollback commit 无效
可能是设置了自动提交,把自动提交关闭
一个连接中insert可以多次执行,select就不行,报错
stmt关联conn的时候,超过一定的数量后报错
发现原因时没有释放 DB_SqlStmtFree(&stmt);
------
之前的oci程序 批量插入数据没有问题
insert into test9 nologging (ID) values(1);
写错了
写成了 insert into test9 (ID) nologging values(1);
sql报错
-------
9-28
看oci8里的函数,在select的时候取字段值有问题
发现是类型参数设置的问题
char c[] = {0,0,0,1};
cout << *((int*)c) << endl;
char str[8] = {0};
*((int*)str) = 1;// 01 00 00 00
cout << *((int*)str) << endl;
cout << sizeof(str) << endl;
char* v[2];
v[0] = new char[8];
cout << sizeof(v[0]) << endl;//4
9-29
一个需求,从GMDB中导出数据到文件中,再导入到Oracle
如果直接在内存中进行对接实现数据传输,不IO到文件中,处理速度会快些,但是出错后再次处理会比较麻烦
---
9-30
分别实现了数据导出,数据导入功能
文件不能有空行
oci@ATAE1:~/tdb/test>
oci@ATAE1:~/tora/bin>
问题:读配置 写日志 整合 性能测试 安全性测试
--
10-8
读文件到变量中
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main()
{
char filename[] = "c.txt";
char str[32] = {0};
int a, b;
ifstream infile(filename);
infile >> str;
infile >> a;
infile >> b;
cout << str << " " << a << " " << b << endl;
return 0;
}
--
10-9
修改程序,使可以插入空字段
#include <stdlib>
system("ls");
调用系统命令
---
10-11
在程序中调用
system("ls");
程序将顺序执行,system("ls");命令执行好了后再继续往下
mv c dat.txt
会覆盖之前的文件,如果存在的话
200机器不能通过ftp访问,但可以使用ftp访问其他的机器,可以这样mput上传文件作中转
----
程序参数
#include <iostream.h>
int main(int argc, char** argv)
{
cout << argc << endl;
cout << argv[0] << " " << argv[1] << endl;
return 0;
}
oci@ATAE1:~/tdb/test> ./targc 11 22
3
./targc 11
oci@ATAE1:~/tdb/test>
-------
10-12
导入数据到表时,为了保证导入数据的可靠性,需要使用一个配置文件进行标识
--
GMDB客户端程序测试,把include lib so 文件加入 ,还要加入so路径到环境变量中
xby@BI01:~/sunyu/src/gmdb> cat env
export
LD_LIBRARY_PATH=/opt/mqm/lib64:/home/xby/lib:/opt/ODBC/lib::/home/oracle/oracle/app/oracle/product/11.1.0/db_1/lib:/
home/xby/sunyu/src/database/gmdb/lib::/home/xby/sunyu/src/database/gmdb/so
执行
. ./env
---
10-13
启动机器上的ftp服务
1。查看是否安装了vsFTPd软件
[root@linuxsir001 root]# rpm -qa | grep vsftpd
如果没有任何显示,说明没有把vsFTPd安装上,如果出现的是下面的这样的提示,就证明已经安装上了。
[root@linuxsir001 root]# rpm -qa | grep vsftpd
vsftpd-1.1.3-8
我以Redhat 9.0,以其自带的vsFTPd包vsftpd-1.1.3-8版本来为本帖约定。
[root@linuxsir001 root]# rpm -ivh vsftpd*.rpm
2。打开vsFTPd服务器。
[root@linuxsir001 root]# ntsysv
把vsftpd服务器打开,也就是在运行
上网机(上网机) 10:26:01
ntsysv命令后,把vsftpd服务选中。
- vsftpd
3。运行/etc/init.d/vsftpd start
[root@linuxsir001 root]# /etc/init.d/vsftpd start
为 vsftpd 启动 vsftpd: [ 确定 ]
[root@linuxsir001 root]#
再编译程序,执行,就可以了
1.修改/etc/vsftpd.conf将里面的write_enable=yes,anonymous_enable=yes,local_login=yes.
2./etc/inetd.conf将里面关于ftp的两行的注释去掉。
3.将/etc/ftpusers中不能出现将来要登录的帐户名。
service vsftpd start
---------
10-14
oracle@bi0001:~> cd
oracle@bi0001:~> vi .bash_profile
LANG=c#
ORACLE_HOME=/oracle/app/oracle/product/11.1.0/db_1; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID
NLS_LANG=american_america.ZHS16GBK; export NLS_LANG
ORA_NLS33=$ORACLE_HOME/nls/data; export ORA_NLS33
LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH
PATH=$PATH:/bin:/usr/bin:/etc
PATH=$PATH:$ORACLE_HOME/bin
export PATH
oracle@bi0001:~> pwd
/opt/oracle
--
添加到root用户的/etc/profile 文件中
bi0001:/etc # ls
bi0001:/etc # vi profile
bi0001:/etc # source profile
---
查看数据库
show parameter DB_NAME
---
打包
tar -cvf tto.tar tora
解包
tar -xvf tto.tar
LD_LIBRARY_PATH=/oracle/app/oracle/product/11.1.0/db_1/lib
LD_LIBRARY_PATH是系统设定的路径变量
----
10-15
指令名称 : chown
使用权限 : root
使用方式 : chmod [-cfhvR] [--help] [--version] user[:group] file...
说明 : Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者。利用 chown
可以将档案的拥有者加以改变。一般来说,这个指令只有是由系统管理者(root)
所使用,一般使用者没有权限可以改变别人的档案拥有者,也没有权限可以自己
的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。
chown -R 递归改变
----
10-18
ps -fau uname
显示用户uname下的进程信息
应该是 ps -fu uname
在root用户下 sqlplus / as sysdba
没有权限
ORA-01031: insufficient privileges
在oracle用户下可以
--
关闭数据库
SQL>shutdown immediate;
启动
SQL>startup
---
10-19
新创建的用户必须要这样赋权才可以连接使用
SQL> grant connect,resource to test;
Grant succeeded.
---
export LD_LIBRARY_PATH=/usr/local/lib:/oracle/app/oracle/product/11.1.0/db_1/lib
在数据导出大整数,小数,出现问题时,可以考虑使用to_char 转换成字符串来处理
应该直接使用col->value->data,不作下面的转换
sprintf(pucStr, "%f", *(double *)col->value->data);
----
导入数据时
01:02:51.22
01:02:57.106
6秒导入16万条数据,没有索引的情况下
---
10-20
修改程序
//2010-10-20
case DB_SQL_T_DECIMAL:
sprintf(pucStr, "%s", col->value->data);
break;
case DB_SQL_T_DOUBLE:
//测试时注意小数是否可以正确输出
sprintf(pucStr, "%f", *(double *)col->value->data);
break;
--
10-21
在gdb调试程序时,set args 来设置程序输入参数
sprintf(str, "%sde", str);
cout << "abc%s = " << str<< endl;
对其自身进行复制,很危险
sprintf(str, "abc%sde", str);
cout << "abc%s = " << str << endl;
------
字段对应表添加字段 字段程度 字段序号
---
10-25
oracle clob类型的使用
在insert语句里字符串的长度有限制