A. 编译安装的apache怎么用service启动
Apache安装后可通过其安装路径的bin目录下的apachectl脚本控制服务的启动和停止。本例中apache安装在/usr/local/apache-2.2.6,服务控制脚本为:
/usr/local/apache-2.2.6/bin/apachectl
执行下面的命令启动Apache服务:
/usr/local/apache-2.2.6/bin/apachectl start
执行下面的命令停止Apache服务:
/usr/local/apache-2.2.6/bin/apachectl stop
可以简单地把Apache启动命令加到/etc/rc.local文件,让Apache随系统启动而自动启动:
echo"/usr/local/apache-2.2.6/bin/apachectl start" >> /etc/rc.local
下面介绍如何把Apache加入到系统服务,用service命令来控制Apache的启动和停止。
首先以apachectl脚本为模板生成Apache服务控制脚本:
grep -v "#"/usr/local/apache-2.2.6/bin/apachectl > /etc/init.d/apache
用vi编辑Apache服务控制脚本/etc/init.d/apache:
vi /etc/init.d/apache
在文件最前面插入下面的行,使其支持chkconfig命令:
#!/bin/sh
# chkconfig: 2345 85 15
# description: Apache is a World Wide Webserver.
保存后退出vi编辑器,执行下面的命令增加Apache服务控制脚本执行权限:
chmod +x /etc/init.d/apache
执行下面的命令将Apache服务加入到系统服务:
chkconfig --add apache
执行下面的命令检查Apache服务是否已经生效:
chkconfig --list apache
命令输出类似下面的结果:
apache 0:off 1:off 2:on 3:on 4:on 5:on 6:off
表明apache服务已经生效,在2、3、4、5运行级别随系统启动而自动启动,以后可以使用service命令控制Apache的启动和停止。
启动Apache服务:
service apache start
停止Apache服务:
service apache stop
执行下面的命令关闭开机自启动:
chkconfig apache off
执行下面的命令改变开机自启动的运行级别为3、5:
chkconfig --level 35 apache on
B. sqlldr是不是sql loader的缩写
罗列了网上常见的三篇Sqlldr的介绍
一:sql loader 的特点
oracle自己带了很多的工具可以用来进行数据的迁移、备份和恢复等工作。但是每个工具都有自己的特点。
比如说exp和imp可以对数据库中的数据进行导出和导出的工作,是一种很好的数据库备份和恢复的工具,因此主要用在数据库的热备份和恢复方面。有着速度快,使用简单,快捷的优点;同时也有一些缺点,比如在不同版本数据库之间的导出、导入的过程之中,总会出现这样或者那样的问题,这个也许是oracle公司自己产品的兼容性的问题吧。
sql loader 工具却没有这方面的问题,它可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。缺点就速度比较慢,另外对blob等类型的数据就有点麻烦了。
二:sql loader 的帮助
C:\>sqlldr
SQL*Loader: Release 9.2.0.1.0 - Proction on 星期六 10月 9 14:48:12 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
用法: SQLLDR keyword=value [,keyword=value,...]
有效的关键字:
userid -- ORACLE username/password
control -- Control file name
log -- Log file name
bad -- Bad file name
data -- Data file name
discard -- Discard file name
discardmax -- Number of discards to allow (全部默认)
skip -- Number of logical records to skip (默认0)
load -- Number of logical records to load (全部默认)
errors -- Number of errors to allow (默认50)
rows -- Number of rows in conventional path bind array or between direct p
ath data saves
(默认: 常规路径 64, 所有直接路径)
bindsize -- Size of conventional path bind array in bytes(默认256000)
silent -- Suppress messages ring run (header,feedback,errors,discards,part
itions)
direct -- use direct path (默认FALSE)
parfile -- parameter file: name of file that contains parameter specification
s
parallel -- do parallel load (默认FALSE)
file -- File to allocate extents from
skip_unusable_indexes -- disallow/allow unusable indexes or index partitions(默
认FALSE)
skip_index_maintenance -- do not maintain indexes, mark affected indexes as unus
able(默认FALSE)
readsize -- Size of Read buffer (默认1048576)
external_table -- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE(
默认NOT_USED)
columnarrayrows -- Number of rows for direct path column array(默认5000)
streamsize -- Size of direct path stream buffer in bytes(默认256000)
multithreading -- use multithreading in direct path
resumable -- enable or disable resumable for current session(默认FALSE)
resumable_name -- text string to help identify resumable statement
resumable_timeout -- wait time (in seconds) for RESUMABLE(默认7200)
date_cache -- size (in entries) of date conversion cache(默认1000)
PLEASE NOTE: 命令行参数可以由位置或关键字指定
。前者的例子是 'sqlload
scott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foo
userid=scott/tiger'.位置指定参数的时间必须早于
但不可迟于由关键字指定的参数。例如,
允许 'sqlldr scott/tiger control=foo logfile=log', 但是
不允许 'sqlldr scott/tiger control=foo log', 即使
参数 'log' 的位置正确。
C:\>
三:sql loader使用例子
a)SQLLoader将 Excel 数据导出到 Oracle
1.创建SQL*Loader输入数据所需要的文件,均保存到C:\,用记事本编辑:
控制文件:input.ctl,内容如下:
load data --1、控制文件标识
infile 'test.txt' --2、要输入的数据文件名为test.txt
append into table test --3、向表test中追加记录
fields terminated by X'09' --4、字段终止于X'09',是一个制表符(TAB)
(id,username,password,sj) -----定义列对应顺序
a、insert,为缺省方式,在数据装载开始时要求表为空
b、append,在表中追加新记录
c、replace,删除旧记录,替换成新装载的记录
d、truncate,同上
在DOS窗口下使用SQL*Loader命令实现数据的输入
C:\>sqlldr userid=system/manager control=input.ctl
默认日志文件名为:input.log
默认坏记录文件为:input.bad
2.还有一种方法
可以把EXCEL文件另存为CSV(逗号分隔)(*.csv),控制文件就改为用逗号分隔
LOAD DATA
INFILE 'd:\car.csv'
APPEND INTO TABLE t_car_temp
FIELDS TERMINATED BY ","
(phoneno,vip_car)
b)在控制文件中直接导入数据
1、控制文件test.ctl的内容
-- The format for executing this file with SQL Loader is:
-- SQLLDR control=<filename> Be sure to substitute your
-- version of SQL LOADER and the filename for this file.
LOAD DATA
INFILE *
BADFILE 'C:\Documents and Settings\Jackey\桌面\WMCOUNTRY.BAD'
DISCARDFILE 'C:\Documents and Settings\Jackey\桌面\WMCOUNTRY.DSC'
INSERT INTO TABLE EMCCOUNTRY
Fields terminated by ";" Optionally enclosed by '"'
(
COUNTRYID NULLIF (COUNTRYID="NULL"),
COUNTRYCODE,
COUNTRYNAME,
CONTINENTID NULLIF (CONTINENTID="NULL"),
MAPID NULLIF (MAPID="NULL"),
CREATETIME DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (CREATETIME="NULL"),
LASTMODIFIEDTIME DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (LASTMODIFIEDTIME="NULL")
)
BEGINDATA
1;"JP";"Japan";1;9;"09/16/2004 16:31:32";NULL
2;"CN";"China";1;10;"09/16/2004 16:31:32";NULL
3;"IN";"India";1;11;"09/16/2004 16:31:32";NULL
4;"AU";"Australia";6;12;"09/16/2004 16:31:32";NULL
5;"CA";"Canada";4;13;"09/16/2004 16:31:32";NULL
6;"US";"United States";4;14;"09/16/2004 16:31:32";NULL
7;"MX";"Mexico";4;15;"09/16/2004 16:31:32";NULL
8;"GB";"United Kingdom";3;16;"09/16/2004 16:31:32";NULL
9;"DE";"Germany";3;17;"09/16/2004 16:31:32";NULL
10;"FR";"France";3;18;"09/16/2004 16:31:32";NULL
11;"IT";"Italy";3;19;"09/16/2004 16:31:32";NULL
12;"ES";"Spain";3;20;"09/16/2004 16:31:32";NULL
13;"FI";"Finland";3;21;"09/16/2004 16:31:32";NULL
14;"SE";"Sweden";3;22;"09/16/2004 16:31:32";NULL
15;"IE";"Ireland";3;23;"09/16/2004 16:31:32";NULL
16;"NL";"Netherlands";3;24;"09/16/2004 16:31:32";NULL
17;"DK";"Denmark";3;25;"09/16/2004 16:31:32";NULL
18;"BR";"Brazil";5;85;"09/30/2004 11:25:43";NULL
19;"KR";"Korea, Republic of";1;88;"09/30/2004 11:25:43";NULL
20;"NZ";"New Zealand";6;89;"09/30/2004 11:25:43";NULL
21;"BE";"Belgium";3;79;"09/30/2004 11:25:43";NULL
22;"AT";"Austria";3;78;"09/30/2004 11:25:43";NULL
23;"NO";"Norway";3;82;"09/30/2004 11:25:43";NULL
24;"LU";"Luxembourg";3;81;"09/30/2004 11:25:43";NULL
25;"PT";"Portugal";3;83;"09/30/2004 11:25:43";NULL
26;"GR";"Greece";3;80;"09/30/2004 11:25:43";NULL
27;"IL";"Israel";1;86;"09/30/2004 11:25:43";NULL
28;"CH";"Switzerland";3;84;"09/30/2004 11:25:43";NULL
29;"A1";"Anonymous Proxy";0;0;"09/30/2004 11:25:43";NULL
30;"A2";"Satellite Provider";0;0;"09/30/2004 11:25:43";NULL
31;"AD";"Andorra";3;0;"09/30/2004 11:25:43";NULL
32;"AE";"United Arab Emirates";1;0;"09/30/2004 11:25:43";NULL
33;"AF";"Afghanistan";1;0;"09/30/2004 11:25:43";NULL
34;"AG";"Antigua and Barbuda";7;0;"09/30/2004 11:25:43";NULL
35;"AI";"Anguilla";7;0;"09/30/2004 11:25:43";NULL
36;"AL";"Albania";3;0;"09/30/2004 11:25:43";NULL
37;"AM";"Armenia";3;0;"09/30/2004 11:25:43";NULL
38;"AN";"Netherlands Antilles";3;0;"09/30/2004 11:25:43";NULL
39;"AO";"Angola";2;0;"09/30/2004 11:25:43";NULL
40;"AP";"Asia/Pacific Region";2;0;"09/30/2004 11:25:43";NULL
41;"AQ";"Antarctica";8;0;"09/30/2004 11:25:43";NULL
42;"AR";"Argentina";5;0;"09/30/2004 11:25:43";NULL
43;"AS";"American Samoa";6;0;"09/30/2004 11:25:43";NULL
44;"AW";"Aruba";5;0;"09/30/2004 11:25:43";NULL
45;"AZ";"Azerjan";1;0;"09/30/2004 11:25:43";NULL
46;"BA";"Bosnia and Herzegovina";3;0;"09/30/2004 11:25:43";NULL
47;"BB";"Barbados";5;0;"09/30/2004 11:25:43";NULL
48;"BD";"Bangladesh";1;0;"09/30/2004 11:25:43";NULL
49;"BF";"Burkina Faso";2;0;"09/30/2004 11:25:43";NULL
50;"BG";"Bulgaria";3;0;"09/30/2004 11:25:43";NULL
51;"BH";"Bahrain";1;0;"09/30/2004 11:25:43";NULL
52;"BI";"Burundi";2;0;"09/30/2004 11:25:43";NULL
53;"BJ";"Benin";2;0;"09/30/2004 11:25:43";NULL
54;"BM";"Bermuda";4;0;"09/30/2004 11:25:43";NULL
55;"BN";"Brunei Darussalam";1;0;"09/30/2004 11:25:43";NULL
56;"BO";"Bolivia";5;0;"09/30/2004 11:25:43";NULL
57;"BS";"Bahamas";7;0;"09/30/2004 11:25:43";NULL
58;"BT";"Bhutan";1;0;"09/30/2004 11:25:43";NULL
59;"BV";"Bouvet Island";5;0;"09/30/2004 11:25:43";NULL
60;"BW";"Botswana";2;0;"09/30/2004 11:25:43";NULL
61;"BY";"Belarus";3;0;"09/30/2004 11:25:43";NULL
2、执行导入命令
C:\>sqlldr userid=system/manager control=test.ctl
c)复杂格式的导入
Sqlldr
sql loader可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,
是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。
缺点就速度比较慢,另外对blob等类型的数据就有点麻烦了。
用法: SQLLDR keyword=value [,keyword=value,...]
有效的关键字:
userid -- ORACLE username/password
control – 控制文件
log – 记录的日志文件
bad – 坏数据文件
data – 数据文件
discard – 丢弃的数据文件
discardmax – 允许丢弃数据的最大值 (全部默认)
skip -- Number of logical records to skip (默认0)
load -- Number of logical records to load (全部默认)
errors – 允许的错误记录数 (默认50)
rows -- Number of rows in conventional path bind array or between direct path data saves
(每次提交的记录数,默认: 常规路径 64, 所有直接路径)
bindsize -- Size of conventional path bind array in bytes(默认256000)
每次提交记录的缓冲区的大小(字节为单位,默认256000)
silent --禁止输出信息 (header,feedback,errors,discards,partitions)
direct – 使用直通路径方式导入 (默认FALSE)
parfile -- parameter file: name of file that contains parameter specifications
parallel -- 并行导入 (默认FALSE)
file -- File to allocate extents from
与bindsize成对使用,其中较小者会自动调整到较大者
sqlldr先计算单条记录长度,乘以rows,如小于bindsize,不会试图扩张rows以填充bindsize;如超出,则以bindsize为准。
external_table
-- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE(默认NOT_USED)
columnarrayrows
-- Number of rows for direct path column array(默认5000)
streamsize -- Size of direct path stream buffer in bytes(默认256000)
multithreading
-- use multithreading in direct path
resumable -- enable or disable resumable for current session(默认FALSE)
resumable_name
-- text string to help identify resumable statement
resumable_timeout
-- wait time (in seconds) for RESUMABLE(默认7200)
date_cache -- size (in entries) of date conversion cache(默认1000)
注意:有两种方式可以指定命令行参数:通过位置或者通过关键字。前者的例子:'sqlldr scott/tiger foo';
后者的例子:'sqlldr control=foo userid=scott/tiger';
不能前面使用关键字指定后面通过位置制定的混合方式;
比如:'sqlldr scott/tiger control=foo logfile=log' 是允许的,
但'sqlldr scott/tiger control=foo log'不允许。
为清楚起见最好所有命令行参数都用关键字指定。
控制文件:
一个控制命令的脚本文件,通常以ctl结尾,内容如下:
LOAD DATA
INFILE 't.dat' 要导入的文件
// INFILE 'tt.date' 导入多个文件
// INFILE * 表示要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容
INTO TABLE table_name 指定装入的表
BADFILE 'c:\bad.txt' 可选,指定坏文件地址,缺省在当前目录下生成与原文件名一致的.bad文件
************* 以下是4种装入表的方式
APPEND 原先的表有数据 就加在后面
INSERT 装载空表 如果原先的表有数据 sqlloader会停止 默认值
REPLACE 原先的表有数据 原先的数据会全部删除
TRUNCATE 指定的内容和replace的相同 会用truncate语句删除现存数据
************* 指定分隔符
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
// TERMINATED BY WRITESPACE 以空白分割
TRAILING NULLCOLS 表的字段没有对应的值时允许为空
************* 下面是表的字段
(
col_1 , col_2 ,col_filler FILLER // FILLER 关键字 此列的数值不会被装载
// 如: lg,lg,not 结果 lg lg
)
如果没声明FIELDS TERMINATED BY ',' 时,可以用下面两种方式实现同样功能:
1.为每一列指定分隔符
(
col_1 [interger external] TERMINATED BY ',' ,
col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,
col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg'
)
2.用位置告诉字段装载数据
(
col_1 position(1:2),
col_2 position(3:10),
col_3 position(*:16), // 这个字段的开始位置在前一字段的结束位置
col_4 position(1:16),
col_5 position(3:10) char(8) // 指定字段的类型
)
BEGINDATA 对应开始的 INFILE * 要导入的内容就在control文件里
10,Sql,what
20,lg,show
asp.net调用bat和ctl文件实现sql*loader的功能
1 后台调用bat文件
Dim proc As System.Diagnostics.Process
proc = System.Diagnostics.Process.Start("cmd.exe", " /c " & "D:\execise\SE004.bat")
proc.WaitForExit()
或者
Shell("cmd.exe /c D:\execise\SE004.bat", AppWinStyle.NormalFocus)
或者
Dim p As New System.Diagnostics.Process
'p.StartInfo.FileName = "cmd.exe"
'p.StartInfo.Arguments = " /c " & "D:\execise\SE004.bat"
'p.StartInfo.UseShellExecute = False
'p.StartInfo.RedirectStandardInput = True
'p.StartInfo.RedirectStandardOutput = True
'p.StartInfo.RedirectStandardError = True
'p.StartInfo.CreateNoWindow = False
'p.Start()
'Dim strValue As String = p.StandardOutput.ReadToEnd()
2 然后调用ctl文件,bat文件的
SQLLDR USERID=spv3/paper@san CONTROL=d:\execise\SE004.CTL log=D:\execise\LOG\SE004.log
3, ctl文件的内容如下
LOAD DATA
INFILE 'D:\execise\SE004.CSV'
TRUNCATE
INTO TABLE TEMP_tableName
FIELDS TERMINATED BY ","
TRAILING NULLCOLS
(
id
,age
,num
,sum
)
4. 数据文件以 逗号分割
C. 怎么让Android系统或Android应用执行shell脚本
一、Android应用启动服务执行脚本
1 如何写服务和脚本
在android源码根目录下有/device/tegatech/tegav2/init.rc文件相信大家对这个文件都不陌生(如果不明白就仔细研读下android启动流程)。如果在该脚本文件中添加诸如以下服务:
service usblp_test /data/setip/init.usblpmod.sh
oneshot
disabled
注解:每个设备下都会有自己对应的init.rc,init.设备名.rc脚本文件。oneshot disabled向我们说明了在系统启动的时候这个服务是不会自动启动的。并且该服务的目的是执行/data/setip/init.usblpmod.sh脚本。脚本的内容你可以随便写,只要符合shell语法就可以了,比如脚本可以是简单的设置eth0:
# ! /system/bin/sh //脚本的开头必须这样写。
Ifconfig eth0 172.16.100.206 netmask 255.255.0.0 up//设置ip的命令
2、如何在应用中启动服务
1)首先了解下在服务启动的流程
1. 在你的应用中让init.rc中添加的服务启动起来。
首先了解下在服务启动的流程:
在设备目录下的init.c(切记并不是system/core/init/init.rc)
Main函数的for(;;)循环中有一个handle_property_set_fd(),函数:
for (i = 0; i < fd_count; i++) {
if (ufds[i].revents == POLLIN) {
if (ufds[i].fd == get_property_set_fd())
handle_property_set_fd();
else if (ufds[i].fd == get_keychord_fd())
handle_keychord();
else if (ufds[i].fd == get_signal_fd())
handle_signal();
}
}
这个函数的实现也在system/core/init目录下,该函数中的check_control_perms(msg.value, cr.uid, cr.gid)函数就是检查该uid是否有权限启动服务(msg.value就是你服务的名字),如果应用为root或system用户则直接返回1.之后就是调用handle_control_message((char*) msg.name + 4, (char*) msg.value),该函数的参数就是去掉1.ctl.后的start和2.你服务的名字。这个函数的详细内容:
void handle_control_message(const char *msg, const char *arg)
{
if (!strcmp(msg,"start")) {
msg_start(arg);
} else if (!strcmp(msg,"stop")) {
msg_stop(arg);
} else if (!strcmp(msg,"restart")) {
msg_stop(arg);
msg_start(arg);
} else {
ERROR("unknown control msg '%s'\n", msg);
}
}
匹配start后调用msg_start.服务就这样起来了,我们的解决方案就是在检查权限的地方“下点功夫”,因为我们不确定uid,所以就让check_control_perms这个函数不要检查我们的uid,直接检查我们服务的名字,看看这个函数:
static int check_control_perms(const char *name, unsigned int uid, unsigned int gid) {
int i;
if (uid == AID_SYSTEM || uid == AID_ROOT)
return 1;
/* Search the ACL */
for (i = 0; control_perms[i].service; i++) {
if (strcmp(control_perms[i].service, name) == 0) {
if ((uid && control_perms[i].uid == uid) ||
(gid && control_perms[i].gid == gid)) {
return 1;
}
}
}
return 0;
}
这个函数里面是必须要检查uid的,我们只要在for循环上写上。
if(strcmp(“usblp_test”,name)==0) //usblp_test就是我们服务的名字。
return 1;
这样做不会破坏android原本的结构,不会有什么副作用。
init.c和init.rc都改好了,现在就可以编译源码了,编译好了装到机子开发板上就可以了。
D. shell脚本如何将参数传到.ctl文件中
两种方案:
在shell中,现将原.ctl备份(建议)再读取,查找修改区域的前后关键字(避免覆盖),replace为新参数,再保存。
将.ctl文件中需要传参位置的原内容写到另一个文件a中,原位置用shell代码读取文件a代替,在shell中将参数写到文件a中,覆盖或追加(取决于备份与否)。
建议使用第二种,不仅效率高,也能体现shell编程的精髓
E. 判断一个字符是否等于Y或者N出现问题。
char ctl; 的字符比较要用 strcmp(..) 或strncmp(...) 函数,字符常量用双引号.
unsigned char ctl; 的字符比较 才可以用单引号'Y','y','N','n',(单引号这些值相当于整型值,才可以用 != 比较).
if (strcmp(ctl,"Y") == 0 || strcmp(ctl,"y") == 0) {
printf("This is Y or y");
} else {
printf("This is "no" \n");
};
F. 如果需要从oracle中每天定时导出数据用什么方法
1、创建数据库日志表导出为文本文件的脚本tabout.ctl或tabout.sql
注意:该日志导出后在c:HttpLog目录下
tabout.ctl脚本内容如下:
SET NEWPAGE NONE
SET HEADING OFF
SET TERM OFF
SET SPACE 0
SET PAGESIZE 0
SET TRIMOUT ON
SET TRIMSPOOL ON
SET LINESIZE 2500
set feedback off
set echo off
SET VERIFY OFF
column v_date new_value filename;
select to_char(sysdate,'yyyymmdd') || '.log' v_date from al;
spool ..HttpLog&&filename
select id||','||name from orcluser.test;
spool off;
exit;
2、创建调用该脚本的logout.bat文件
logout.bat内容如下:
mkdir ..HttpLog
C:oracleora92insqlplus orcluser/orcl @C:Oracleout.ctl
说明:该bat文件直接在当前目录下创建名为HttpLog的文件夹,以便tabout.ctl脚本输出的文件存放到该目录下。其通过调用Oracle中sqlplus可执行文件来执行tabout.ctl脚本,所以该文件直接双击即可运行,无需其他操作。
3、通过windows定时任务实现自动定期执行
“在控制面板——任务计划——添加任务计划”中建立定期将数据库中日志表数据导出为文本格式(如:你可以根据需求设置为每天对日志表数据进行导出)。根据你当前对日志文件路径的存储需求,修改上面两个脚本中的存储路径,在windows定时任务直接调用logout.bat文件执行即可。
G. Oracle数据库不在本地怎么使用sqlloader
sqlloader的使用与Oracle数据库是否在本地无关。前提是本地必须装有Oracle客户端。
使用Oracle版本:Oracle10g。
步骤:
1、配置本地连接远程数据库。在Oracle安装目录下,如“C:oracleproct10.2.0db_1 etworkADMIN”找到tnsnames.ora文件,增加内容(中文部分需要根据实际情况修改)并保存:
本地实例名(可自定义英文+数字组合)=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=服务器IP或服务器主机名)(PORT=Oracle端口号))
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=数据库服务名)
)
)
2、根据本地的要sqlloader的脚本在数据库中建立相应的表,数据举例如下:
H. CLI CLR CTL的全称与作用分别是什么
编辑词条 C++/CLI 什么是C++/CLI呢?C++当然指的是Bjarne Stroustrup在BELL实验室发明的C++语言,它实现了运行时取得速度和尺寸最佳化的静态对象模型,然而它除了堆分配外不支持程序的动态修改,它准许无限地接近底层设备,但在程序运行过程中几乎无法操作活动类型,也无法操作与程序相关联的底层结构。Herb Sutter,C++/CLI的主要构造者之一,称C++是一门“混凝土”式的语言。
CLI指的是通用语言结构,一种支持动态组件编程模型的多重结构,在许多情况下,这代表了一个与C++对象模型完全颠倒了的模式。一个时实的软件层,有效地执行系统,在底层操作系统与程序之间运行。操作底层的设备受到一定的限制,操作执行程序中的活动类型及与程序相关联的下部结构得到了支持。反斜杠(/)代表C++和CLI的捆绑,这个捆绑带来的细节问题是本文主要讨论的问题。
所以,“什么是C++/CLI”问题的最初、最接近答案是:它是静态C++对象模型到CLI的动态组件对象编程模型的捆绑。简而言之,它就是你如何用C++在.NET中编程,而不是C#或Visual Basic.NET。象C#和CLI本身一样,C++/CLI正在ECMA(欧洲计算机制造商协会)主持下进行标准化,以最终符合ISO标准。
实时通用语言(CLR)是CLI的微软版本,它非常适用于微软的Windows操作系统,相似地,Visual C++2005是C++/CLI的实现。
作为第二个近似的答案,我认为C++/CLI是.NET编程模式与C++的结合,正如以前将模板与C++结合起来产生的泛型编程。所有这种结合中,企业所拥有的C++的投资以及开发人员使用C++的经验将得到保存,而这恰恰是使用C++/CLI进行开发的重要基础。
学习C++/CLI的方法
在设计C++/CLI语言中涉及三个方面问题,这同样贯彻于所有的其他程序开发语言:一是语言级的语法向底层通用类型系统(简称CTS)的映射;二是向程序开发人员提供的CLI的底层细节结构的级别选择;三是超越CLI的直接支持,提供额外的功能性函数的选择。
第一条对于所有的CLI语言来说都大致相同,第二条和第三条对于不同的CLI语言来说是不同的,相互区别的。根据你需要解决什么样的问题,你将选择这种或那种语言,也有可能混合使用多种CLI语言。学习C++/CLI涉及到了解它在设计过程中的所有这些涉及方面。
从C++/CLI到CTS的映射?
使用C++/CLI编程时间了解底层的CTS非常重要。CTS包括以下三种常用类的类型:
1、多态引用类型,这正是对于所有继承类所要使用的。
2、非多态值类型,这用于实时高效的具体类型,例如数值类型。
3、抽象的接口类型,这用于定义一个操作集,也可以用于实现接口的引用或值类型集合。
这个设计方面的问题,即将CTS映射到语言内建的数据类型集合,通常同样贯穿于所有的CLI语言,虽然不同的CLI语言语法不同。所以,在C#中你可能这么写:
abstract class Shape { ... } // C#
来定义了一个Shape基类,从该类将导出几何对象,然而在C++/CLI你将这么写:
ref class Shape abstract { ... }; // C++/CLI
上述代码说明了底层的C++/CLI引用类型。这两种声明在内层代表的意思是一样的。相似地,在C#中你这么写:
struct Point2D { ... } // C#
来定义一个具体的Point2D 类,然而在C++/CLI中这么写:
value class Point2D { ... }; // C++/CLI
C++/CLI支持的类型集合代表了CTS与本地设备的综合,这决定了你的语法选择,例如:
class native {};
value class V {};
ref class R {};
interface class I {};
CTS也支持与本地列举类型稍微不同的列举类类型。当然,对于上述两者CTS是都支持的。例如:
enum native { fail, pass };
enum class CLIEnum : char { fail, pass};
相似地,CTS支持它本身的数组类型,并且它再一次将其与本地数组在行为上区分开来。同时,微软再次为这两种类型提供了支持。
int native[] = { 1,1,2,3,5,8 };
array<int>^ managed = { 1,1,2,3,5,8 };
那种认为一种CLI语言比其他CLI语言在向底层的CTS映射中表现的更出色或更完美都是不确切的,相反,每种不同的CLI语言代表着对CTS底层对象模型的不同理解,在下一节你将更清楚地看到这一点。
CLI的细节
设计一个CLI语言时第二个必须要考虑的问题是将CLI的底层执行模式融入到语言的细节级别。这种语言用于解决什么问题?这种语言是否有必须的工具来解决这些问题?这种语言可能吸引什么样的程序开发人员?
例如,值类型存在于托管堆上,在很多情况下值类型可以看到它们自身的存在。
1、通过隐含的加箱操作,当一个值类型的实例被分配给一个对象或当一个虚拟的方法通过一个值类型来调用;
2、当这个值类型被当作应用引用类类型的成员时;
3、当这个值类型 被当作CLI数组成员时;
需要指出的是,这种情况下开发人员是否被允许操作值类型的地址是CLI语言设计时必须应该予以考虑的问题。
存在的问题
在垃圾收集器扫描紧缩状态下,位于托管堆上的任何对象非常可能面对重新定位问题。指向对象的指针可以实时跟踪并修改。开发人员不能自己手动跟踪,所以,如果你获许取得一个可能位于托管堆上的值类型的地址时,除了本地指针外,还需要有一个跟踪形态的指针。
销售商考虑的是什么?那就是需要简单和安全,在语言中直接提供跟踪一个对象或集合的指针使语言复杂化,没有这种支持,将减少复杂程度,可资利用的、潜在的程序开发人群可能会增加,此外,准许程序开发人员操作生命短暂的值类型,增加了错误产生的可能性,程序开发人员可能有意无意地对内存进行错误操作,不支持跟踪指针,一个潜在的更安全地实时环境产生了。
另一方面,效率和灵活性也是必须考虑的一个问题,每一次向同一个对象分配值类型时,一个全新的数值加箱操作发生了,准许存取加箱值类型允许在内存中进行更新,这可能在性能上产生了一个非常巨大的进步。没有跟踪形态的指针,你无法用指针算法重新声明一个CLI数组,这意味着CLI数组不能使用标准模板库进行重新声明,也不能使用一般的算法。准许操作加箱数值使设计具有更大地灵活性。
微软在C++/CLI中选择地址集合模式来处理托管堆上的值类型。
int ival = 1024;
int^ boxedi = ival;
array<int>^ ia = gcnew array<int>{1,1,2,3,5,8};
interior_ptr<int> begin = &ia[0];
value struct smallInt { int m_ival; ... } si;
pin_ptr<int> ppi = &si.m_ival;
典型地C++/CLI开发人员是一个复杂的系统程序员,承担着提供下层内部构造和有组织的应用程序的任务,而这些恰恰是未来商业发展的基础。C++/CLI开发人员必须兼顾可测量性和可执行性,所以必须在系统的高度级上来看待CLI下层结构。CLI细节水平反映了开发人员的脸色。
复杂性本身并不代表对质量的否定,人类比单细胞细菌复杂的多,这当然不是一件坏事,然而,当表达一个简单的概念变的复杂化后,这常常被认为是一件坏事。在C++/CLI中,CLI开发团队已经试着提供一种精巧的方法来表达方式一个复杂的事情。
额外增加的功能
第三个设计方面是特定功能性的语言层,它远远超过CLI所提供的直接支持,虽然这可能需要在语言层支持和CLI底层执行模式间建立一个映射。但在某些情况下,这恰恰是不可能的,因为语言无法调节CLI的行为。这种情况的例子就是在基类的构造及析构函数中定义虚函数。根据ISO-C++在这种情况下的语言学,需要用每一个基类的构造和虚构函数重新设置虚拟表,而这是不可能的,因为虚拟表句柄是实时管理的,而不是某一个语言来管理。
所以,这个设计方面是在完美性和可行性之间的妥协产物,C++/CLI提供的额外功能主要表现在三个方面:
1、获取资源的一种形式是对于引用类型的初始化,此外,提供一种自动化工具,用于占用较少资源、所谓的可确定性自动消亡的垃圾收集类型对象。
2、一种深度拷贝形式的语法与C++拷贝构造函数和拷贝分配操作符相一致,但其并不适用与值类型。
3、除了最初的一般性CLI机制外,还有对于CTS类型的C++模板直接支持。这些是我第一篇文章中讨论的主题。此外,还提供了针对CLI类型的可校验STL版本。
让我们来看一个简单的例子,一个确定性消亡问题。在垃圾搜集器重新声明一块与对象相关联的内存之前,一个相关的消亡方法,如果存在的话,将被调用。你可以认为这种方法是超级析构函数,因为它与对象的程序生命期无关。这就叫做终结。终结函数是否调用以及什么时间调用都没有明确规定,这就是垃圾收集器的非确定性终结。
在动态内存管理的情况下,非确定性终结工作非常好,当可用内存变的越来越少时,垃圾收集器介入并开始着手解决问题。然而,非决定性终结也有工作不好的时候,当一个对象维护一个重要资源,例如一个数据库连接、锁定某些类别、或者可能是本地的堆内存。在这种情况下,只要是不需要,应立即释放资源。目前CLI所支持的解决问题的方法是,对于一个类通过执行IDisposable接口提供的Dispose方法释放资源。这里的问题是执行Dispose方法需要一个清晰的声明,所以它也就不可能存在调用。
最基本的C++中的设计模式是上述的通过初始化来获取资源,这意味着类使用构造函数来获取资源,相反,类使用析构函数来释放资源。这些行为由类对象在生存期内自动管理。
下面是引用类释放资源时所做的顺序动作:
1、 首先使用析构函数来封装所有与释放类有关的资源时所必须的代码;
2、 析构函数自动调用后,结束类对象的生命期。
对于引用类型来说,CLI没有类析构函数的概念,所以析构函数不得不映射为在底层执行的其它代码。此时,在内部,编译器执行以下操作:
1、 类让其基类列表继承自IDisposable接口;
2、 析构函数转换成IDisposable的Dispose方法。
以上实现了目标的一半,一种实现析构造函数自动调用的方法仍然需要,对于引用类型,一种特殊的基于栈的符号得到支持,也就是说,一个对象的生命期与它的声明范围有关。在内部,编译器将符号转换为在托管堆上分配引用对象。随着作用域的终结,编译器插入一个Dispose方法-用户定义的析构函数。与对象有关的内存的收回在垃圾收集器的控制下得到执行。
C++/CLI并不是将C++拓展到一个托管的世界,更确切的说,它代表一个完全综合的范例,某种程度上就象当初将泛编程模式和多重继承综合进该语言一样。我认为C++/CLI开发小组做了一项非常卓有成效的工作。
小结
C++/CLI代表托管和本地编程的结合。在反复过程中,这种综合已经通过源级相对独立但又相互平等地组件和二进制元素得到了完成,包括混合模式(本地和CTS类型的源级混合,还有一个本地及CLI对象文件的二进制混合),纯模式(本地和CTS类型的源代码级混合,所有的都被编译为CLI对象文件),本地分类(可以通过一个特定的打包类来保持CTS类型),和CTS分类(可以保持本地类型为指针)。
当然,C++/CLI开发人员也可以单独使用CLI类型来编程,并通过这种方式来提供伺服状态下的可校验代码,例如可以作为SQL Server2005的一个SQL存储过程。
现在,还是回到这个问题上来,什么是C++/CLI?它是进行.NET编程模式的最佳切入点。对于C++/CLI,有一个来自C++的迁移路径,它不仅包含C++的底层基础,而且也需要C++编程经验,对于这些,我感到非常满意。
C++/CLI(CLI:Common Language Infrastructure)是一门用来代替C++托管扩展(下文使用MC++指代)新的语言规范。重新简化了C++托管扩展的语法,提供了更好的代码可读性。和微软.NET的其他语言一样,微软向ECMA提交了C++/CLI的标准。C++/CLI现在可以在Visual C++ 2005上开发。C++/CLI的部分特性已经申请了专利。
1 语法改变
C++/CLI是一门独立的语言(比如新的关键字),而不是像C++托管扩展一样是C++的超集 (C++托管扩展有一些不标志的关键字如__gc和__value)。所以,C++/CLI对于这些语法有较大的改变,尤其是去除了一些意义不明确的关键字,增加了一些.NET的特性.
很多不一致的语法,像MC++的不同版本用法的操作符new()被区分开:在C++/CLI,.NET引用类型的创建要使用新的关键字gcnew。并且C++/CLI增加了新的泛型概念(与C++ templates相似,但还是有很大的区别)。
1.1 句柄(Handle)
回到MC++,有两类指针: 用__nogc标识的指针是传统意义上的C++指针,而用__gc标识的指针为.NET中的引用。但在C++/CLI里,唯一的指针就是传统意义上的C++指针,而.NET引用类型使用一个“句柄”来获取,使用新的语法“类名^”代替了MC++的“类名*”。新的句法使得托管和非托管代码混合开发更加方便;它指明了对象将会被垃圾回收器自动销毁还是手动销毁。
范例代码:
// C++托管扩展
#using <mscorlib.dll>
using namespace System::Collections;
__gc class referencetype
{
protected:
String* stringVar;
int intArr __gc[];
ArrayList* doubleList;
public:
referencetype(String* str,int* pointer,int number) // 哪个是托管的?
{
doubleList = new ArrayList();
System::Console::WriteLine(str->Trim() + number.ToString());
}
};
// C++/CLI
#using <mscorlib.dll>
using namespace System::Collections::Generic;
ref class referencetype
{
protected:
String^ stringVar;
array<int> intArr;
List<double>^ doubleList;
public:
referencetype(String^ str,int* pointer,int number) // 不会再分不清了吧?
{
doubleList = gcnew List<double>();
System::Console::WriteLine(str->Trim() + number);
}
};
1.2 跟踪引用(Tracking reference)
C++/CLI里的一个“跟踪引用”也是一个句柄,但它是传地址而不是传值。等同于在C#中加了“ref”关键字,或Visual Basic .NET的“ByRef”。C++/CLI使用“^%”语法来定义一个跟踪引用。与传统C++中的“*&”语法相似。
下面的示例了“跟踪引用”的使用。如果把“^%”改成“^”(也就是使用普通的句柄),10个字符串将不会被修改,而只会生成那些字符串的副本,这些都是因为那些引用已经不是传地址而是传值。
int main()
{
array<String^>^ arr = gcnew array<String^>(10);
int i = 0;
for each(String^% s in arr)
s = gcnew String(i++.ToString());
return 0;
}
上面的代码示例了用户如何用C++/CLI做一些其他.NET语言不能做的事情,比如C#就不允许在foreach循环中这样做。例如foreach(ref string s in arr)在C#中是非法的。
1.3 析构(Finalizer/Destructor)
C++/CLI的另一个变化就是使用“!类名()”来声明一个托管类型的“析构方法”(在垃圾回收器回收对象之前的不确定的时间由CLR调用),而原来的“~类名()”是用来定义“传统的析构函数”(能被用户自己调用)。另外,下面的例子说明了如何在C++/CLI中托管对象如何自动调用“传统析构函数”。
在一个典型的.NET程序中(例如直接使用CIL)编程,可以由用户自己调用的“析构方法”是用实现IDisposable接口,通过编写Dispose方法来实现显式释放资源;而不确定的“析构方法”是通过重载Finalize函数来实现的。
// C++/CLI
ref class MyClass // :IDisposable (编译器自动实现IDisposable接口)
{
public:
MyClass(); // 构造函数
~MyClass(); // (确定的) 析构函数 (编译器使用IDisposable.Dispose来实现)
protected:
!MyClass(); // 析构方法 (不确定的) (编译器通过重载virtual void Finalize来实现)
public:
static void Test()
{
MyClass auto; // 这不是个句柄,它将调用MyClass的默认构造函数
// 使用auto对象
// 函数返回前自动调用auto的析构函数(IDisposable.Dispose,由~MyClass()定义)来释放资源
// 以上代码等效于:
MyClass^ user = gcnew MyClass();
try { /* 使用auto对象 */ }
finally { delete user; /* 由编译器调用auto.Dispose() */ }
}
};
// C#
class MyClass : IDisposable
{
public MyClass() {} // 构造函数
~MyClass() {} // 析构方法 (不确定的) (编译器通过重载virtual void Finalize来实现),与C++/CLI的!MyClass()等效
public void Dispose() {} // Dispose方法
public static void Test()
{
using(MyClass auto = new MyClass())
{ /* 使用auto对象 */ }
// 因为使用了using句法,编译器自动调用auto.Dispose()
// 以上代码等效于:
MyClass user = new MyClass();
try { /* 使用user对象 */ }
finally { user.Dispose(); }
}
}编辑词条 CLR CLR(公共语言运行库,Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。
为了提高平台的可靠性,以及为了达到面向事务的电子商务应用所要求的稳定性级别,CLR还要负责其他一些任务,比如监视程序的运行。按照.NET的说法,在CLR监视之下运行的程序属于“受管理的”(managed)代码,而不在CLR之下、直接在裸机上运行的应用或者组件属于“非受管理的”(unmanaged)的代码。
CLR将监视形形色色的常见编程错误,许多年来这些错误一直是软件故障的主要根源,其中包括:访问数组元素越界,访问未分配的内存空间,由于数据体积过大而导致的内存溢出,等等。
然而,这种对受管理代码的运行监视是有代价的。虽然当前还不可能精确地得到监视程序运行所需要的开销,但从当前Beta测试版的性能表现来看,正如Microsoft所承认的那样,我们可以预料由它导致的性能降低程度至少达到10%。当然,如果监视程序运行能够将稳定性和可用性提高到一个新的档次,我们可以怀疑10%的性能降低是否还可以称为一件坏事……
在处理器性能改善方面,摩尔定律已经一再被证明是正确的。既然如此,我们要得到一台性能增加了10%的服务器要等待多长时间呢、
单片机 汇编 指令:CLR C//C状态清零单片机 汇编 指令:CLR C//C状态清零
另有:CLR 公用语言运行时 Common Language Runtime
.NET提供了一个运行时环境,叫做公用语言运行时(Common Language Runtime),是一种多语言执行环境,支持众多的数据类型和语言特性。他管理着代码的执行,并使开发过程变得更加简单。这是一种可操控的执行环境,其功能通过编译器与其他工具共同展现。
依靠一种以运行时为目标的编译器开发的代码叫做可操控代码。
元数据:为了使运行时环境可以向可操控代码提供服务,语言编译器需要产生一种元数据,它将提供在使用语言中的类型、成员、引用的信息。运行时环境使用元数据定位并载入类,在内存中展开对象实例,解决方法调用,产生本地代码,强制执行安全性,并建立运行时环境的边界。
可操控执行的含义:对象在执行的过程中完全被运行时环境所控制。运行时环境提供以下服务:自动内存管理、调试支持、增强的安全性及与非可操控性代码的互操作性。条件:1、选择以运行时为目标的语言编译器,如VB、C#;2、在组件的输出类型中使用CLR要求的语言特性。
CLR生化技术介绍
CLR生物处理技术是我司联合中山大学基于生物接触氧化法、UNITANK、CASS处理方法的基础上并结合我司CLR生物复合菌技术而研发成功的专有技术。CLR生物复合菌是综合了国内外先进技术,采用高科技手段,将自然水体中有益的微生物,通过特殊的设备分离、提纯、培殖驯化、浓缩后配制成高活性、高浓度、多组合的固剂或水剂贮存。CLR生物处理技术是利用环境微生物处理技术组合成的一种高效污水生化处理技术。它由微生物复合菌群及载体等组成,并配与严格的供氧量,其主要是通过人工强化技术,将我公司培殖的CLR复合菌群一次性引入到污水处理系统内,系统内设有特殊的CLR-TL生物载体(也称生物床),便于微生物快速结膜繁衍生存。在一定曝气供氧条件下生物载体上逐渐形成菌群生物膜,利用其新陈代谢作用吸附、消化、分解污水中的有机污染物,使之转化为稳定的无害化物质,达到净化水质的目的。
CLR生化技术主要特点如下:
①、池内单位容积的生物固体量都高于活性污泥法曝气池及生物滤池,因此,其具有较高的容积负荷,最高可达到2.0 kgCOD/(m3·d);
②、CLR生化池内培养的是我司专有的CLR生物复合菌,处理效果显着,也不存在污泥膨胀问题,运行管理简便;
③、CLR生化池由于兼有活性污泥法和生物膜法的特点,因此,单位体积内有较高的微 生物量,使得该工艺具有一定的抗冲击能力;
④、污泥产量较少。
CLR工艺技术讨论区
氧化沟(Qxidation Ditch)称为连续式反应池(Continuous Loop Reactor),简称CLR,最早是由帕斯维尔(A.Psaveer)博士设计,于1954年在荷兰沃绍本建造并投入使用。之后,相继成为欧洲、大洋洲、南非和北美洲的一种重要污水处理技术。到目前为止,西方国家已经建造了近1500座氧化沟。七十年代末,氧化沟技术进入我国,并引起环保界的极大兴趣。根据氧化沟的处理机理,研究开发了多种型式的氧化沟工艺,如卡鲁塞尔(Carroussel)型、奥伯尔(Orbal)型、射流曝气式、导管式、一体化式等多种形式的氧化沟。
DE型氧化沟
DE型氧化沟是丹麦克鲁格公司在间歇运行的氧化沟基础上发展的一种新型的氧化沟。在运行稳定可靠的前提下,操作更趋灵活方便。DE型氧化沟为双沟半交替工作式氧化沟系统,具有良好的生物除氮功能。它与D型、T型氧化沟的不同之处是二沉池与氧化沟分开,并有独立的污泥回流系统。两个氧化沟相互连通,串联运行,交替进水。沟内设双速曝气转刷,高速工作时曝气充氧,低速工作时只推动水流,基本不充氧,使两沟交替处于厌氧和好氧状态,从而达到脱氮的目的。若在DE氧化沟前增设一个缺氧段,可实现生物除磷,形成脱氮除磷的DE型氧化沟工艺。
Carrousel氧化沟是由荷兰DHV技术咨询公司在六十年代后期发明的,当时开发这一工艺的主要目的是寻求一种渠道更深、效率更高和机械性能更好的系统设备来改善和弥补当时流行的转刷式氧化沟的技术特点。
与其它池型氧化沟相比,其最大的特点是采用特殊设计的立式低速表曝机作曝气设备,由于曝气设备的不同(区别于其它水平轴式曝气装置),使污水在混合曝气充氧的同时具有泵的局部水力提升作用,使混合液和原水得到彻底的混合。
奥贝尔氧化沟由三个相对独立的同心椭园形沟道组成,污水由外沟道进入沟内,然后依次进入中间沟道和内沟道,最后经中心岛流出,至二次沉淀池。三个环形沟道相对独立,溶解氧分别控制在0、1、2 mg/l,其中外沟道容积达50%~60%,处于低溶解氧状态,大部分有机物和氨氮在外沟道氧化和去除。内沟道体积约为10%~20%,维持较高的溶解氧(2mg/l),为出水把关。在各沟道横跨安装有不同数量转碟曝气机,进行供氧兼有较强的推流搅拌作用。
奥贝尔氧化沟除具备一般氧化沟的优点:流程简单、抗冲击负荷能力强、出水水质稳定和易于维护管理。
3.细胞毒性T淋巴细胞 细胞毒性T淋巴细胞(cytotoxic lymphocyte,CTL)是白细胞的亚部,为一种特异T细胞,专门分泌各种细胞因子参与免疫作用。对某些病毒、肿瘤细胞等抗原物质具有杀伤作用,与自然杀伤细胞构成机体抗病毒、抗肿瘤免疫的重要防线。
杀伤机制:
1.释放穿孔素,颗粒酶杀伤靶细胞。
2.通过Fasl介导靶细胞的凋亡。
作用特点:
1.可连续杀伤靶细胞,具有高效性
2.具有抗原特异性
3.具有自身MHC限制性
Coal-to-liquids(CTL),煤制油,由煤炭气化生产合成气、再经费-托合成生产合成油称之为煤炭间接液化技术。
2.
I. sqlloader 的CTL 文件里 filter怎么写
sqlldr userid=lgone/tiger control=a.ctl
LOAD DATA
INFILE 't.dat' // 要导入的文件
// INFILE 'tt.date' // 导入多个文件
// INFILE * // 要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容
INTO TABLE table_name // 指定装入的表
BADFILE 'c:\bad.txt' // 指定坏文件地址
************* 以下是4种装入表的方式
APPEND // 原先的表有数据 就加在后面
// INSERT // 装载空表 如果原先的表有数据 sqlloader会停止 默认值
// REPLACE // 原先的表有数据 原先的数据会全部删除
// TRUNCATE // 指定的内容和replace的相同 会用truncate语句删除现存数据
************* 指定的TERMINATED可以在表的开头 也可在表的内部字段部分
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
// 装载这种数据: 10,lg,"""lg""","lg,lg"
// 在表中结果: 10 lg "lg" lg,lg
// TERMINATED BY X '09' // 以十六进制格式 '09' 表示的
// TERMINATED BY WRITESPACE // 装载这种数据: 10 lg lg
TRAILING NULLCOLS ************* 表的字段没有对应的值时允许为空
************* 下面是表的字段
(
col_1 , col_2 ,col_filler FILLER // FILLER 关键字 此列的数值不会被装载
// 如: lg,lg,not 结果 lg lg
)
// 当没声明FIELDS TERMINATED BY ',' 时
// (
// col_1 [interger external] TERMINATED BY ',' ,
// col_2 [date "dd-mon-yyy"] TERMINATED BY ',' ,
// col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg'
// )
// 当没声明FIELDS TERMINATED BY ','用位置告诉字段装载数据
// (
// col_1 position(1:2),
// col_2 position(3:10),
// col_3 position(*:16), // 这个字段的开始位置在前一字段的结束位置
// col_4 position(1:16),
// col_5 position(3:10) char(8) // 指定字段的类型
// )
BEGINDATA // 对应开始的 INFILE * 要导入的内容就在control文件里
10,Sql,what
20,lg,show
=====================================================================================
//////////// 注意begindata后的数值前面不能有空格
1 ***** 普通装载
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(DEPTNO,
DNAME,
LOC
)
BEGINDATA
10,Sales,"""USA"""
20,Accounting,"Virginia,USA"
30,Consulting,Virginia
40,Finance,Virginia
50,"Finance","",Virginia // loc 列将为空
60,"Finance",,Virginia // loc 列将为空
2 ***** FIELDS TERMINATED BY WHITESPACE 和 FIELDS TERMINATED BY x'09' 的情况
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY WHITESPACE
-- FIELDS TERMINATED BY x'09'
(DEPTNO,
DNAME,
LOC
)
BEGINDATA
10 Sales Virginia
3 ***** 指定不装载那一列
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
( DEPTNO,
FILLER_1 FILLER, // 下面的 "Something Not To Be Loaded" 将不会被装载
DNAME,
LOC
)
BEGINDATA
20,Something Not To Be Loaded,Accounting,"Virginia,USA"
4 ***** position的列子
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
( DEPTNO position(1:2),
DNAME position(*:16), // 这个字段的开始位置在前一字段的结束位置
LOC position(*:29),
ENTIRE_LINE position(1:29)
)
BEGINDATA
10Accounting Virginia,USA
5 ***** 使用函数 日期的一种表达 TRAILING NULLCOLS的使用
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS // 其实下面的ENTIRE_LINE在BEGINDATA后面的数据中是没有直接对应
// 的列的值的 如果第一行改为 10,Sales,Virginia,1/5/2000,, 就不用TRAILING NULLCOLS了
(DEPTNO,
DNAME "upper(:dname)", // 使用函数
LOC "upper(:loc)",
LAST_UPDATED date 'dd/mm/yyyy', // 日期的一种表达方式 还有'dd-mon-yyyy' 等
ENTIRE_LINE ":deptno:dname:loc:last_updated"
)
BEGINDATA
10,Sales,Virginia,1/5/2000
20,Accounting,Virginia,21/6/1999
30,Consulting,Virginia,5/1/2000
40,Finance,Virginia,15/3/2001
6 ***** 使用自定义的函数 // 解决的时间问题
create or replace
function my_to_date( p_string in varchar2 ) return date
as
type fmtArray is table of varchar2(25);
看看参考下!