shell 将当前时间写入指定文件行

 

#!/bin/sh

 

aa="/root/aa"

sed '/#define  DateTime /'d $aa > temp

printf "#define  DateTime /"" >> temp

date +%Y%m%d-%k:%M:%S/" >> temp

cp temp $aa

rm -f temp

 

<think>我们有一个任务:使用shell脚本将文件内容插入到Oracle数据库中。 根据引用[1],我们知道可以通过映射端口连接到Oracle数据库。这假设我们已经有一个运中的Oracle容器或实例,并且我们知道连接信息(如用户名、密码、主机、端口、服务名/SID)。 根据引用[3],我们可以看到一些Oracle的SQL语句示例,包括创建表空间、用户以及授权,但我们的需求是插入数据。 步骤: 1. 我们需要一个目标表来存储文件内容。假设我们已经有一个表,例如: CREATE TABLE file_content ( id NUMBER, line_content VARCHAR2(4000) ); 或者,如果文件是CSV格式,我们可能希望将每一列分开存储。但问题没有指定文件格式,所以我们假设每作为一条记录插入。 2. 在shell脚本中,我们可以使用Oracle的sqlplus工具来执SQL插入语句。 3. 我们需要读取文件,并为每一行构造一个INSERT语句。但是,如果文件很大,逐插入效率较低。我们可以考虑使用SQL*Loader(外部表或sqlloader)来提高效率。但用户要求使用shell脚本,所以我们可以用shell循环,但注意性能问题。 4. 另一种方法是使用外部表,但需要配置Oracle目录等,可能不适合所有环境。 5. 这我们提供一个简单的shell脚本示例,它逐读取文件并插入到表中。注意:如果文件包含特殊字符(如单引号),需要转义。 6. 我们假设连接信息如下: username: your_username password: your_password host: localhost port: 1521 service: ORCLPDB1 (或者SID,根据你的设置) 7. 使用sqlplus的连接字符串:`sqlplus username/password@//host:port/service_name` 示例脚本(insert_file.sh): ```bash #!/bin/bash # 设置Oracle数据库连接信息 USER="your_username" PASS="your_password" HOST="localhost" PORT="1521" SERVICE="ORCLPDB1" CONNECTION_STRING="$USER/$PASS@//$HOST:$PORT/$SERVICE" # 输入文件路径 FILE_PATH="/path/to/your/file.txt" # 表名 TABLE_NAME="file_content" # 使用一个临时文件来存储所有的SQL命令 SQL_FILE="insert_script.sql" # 生成SQL文件,先一个BEGIN,然后每一个INSERT,最后COMMIT echo "BEGIN" > $SQL_FILE while IFS= read -r line do # 转义单引号:将每个单引号替换成两个单引号 line_escaped=$(echo "$line" | sed "s/'/''/g") # 构造插入语句 echo "INSERT INTO $TABLE_NAME (line_content) VALUES ('$line_escaped');" >> $SQL_FILE done < "$FILE_PATH" echo "COMMIT;" >> $SQL_FILE echo "EXIT;" >> $SQL_FILE # 使用sqlplus执SQL文件 sqlplus -s /nolog << EOF CONNECT $CONNECTION_STRING @$SQL_FILE EOF # 清理(可选) # rm $SQL_FILE ``` 注意: - 这个脚本对每一行都生成一个INSERT语句,然后在一个事务中提交(BEGIN...COMMIT)。如果文件非常大,这可能会导致性能问题(内存和速度)。 - 如果文件很大,建议分批提交(比如每1000提交一次)或者使用SQL*Loader。 - 转义单引号是必要的,否则当中包含单引号时,SQL语句会出错。 8. 如果文件很大,建议使用SQL*Loader,这是Oracle提供的高效数据加载工具。但是,它需要额外的控制文件。这也提供一个使用SQL*Loader的示例: 首先,创建一个控制文件(load.ctl): ```control LOAD DATA INFILE '/path/to/your/file.txt' APPEND INTO TABLE file_content FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( line_content ) ``` 注意:上面的控制文件假设文件是CSV格式,但如果是每一个字段,我们可以将整个作为一个字段。这我们使用FIELDS TERMINATED BY ',',但实际上如果文件只有一列(整个),我们可以使用`FIELDS TERMINATED BY '\n'`?但这样不,因为每一行就是一个记录。实际上,对于整个作为一列,我们可以这样: 修改控制文件(如果文件是纯文本,每作为一个字段): ```control LOAD DATA INFILE '/path/to/your/file.txt' APPEND INTO TABLE file_content FIELDS TERMINATED BY X'0A' -- 用换符分隔,但实际上每就是一条记录,所以这样不。实际上,对于固定的一列,我们可以这样: ( line_content POSITION(1:4000) CHAR -- 指定整个,但这样也不对,因为SQL*Loader默认每一条记录,所以我们可以将整个映射到一个字段 ) ``` 更简单的控制文件法(对于整个作为一列): ```control LOAD DATA INFILE '/path/to/your/file.txt' APPEND INTO TABLE file_content FIELDS TERMINATED BY X'0A' -- 实际上这不需要字段分隔符,因为只有一列,但我们可以用换符作为记录分隔符 TRAILING NULLCOLS ( line_content CHAR(4000) -- 注意:这最大长度4000,因为Oracle中VARCHAR2最大4000 ) ``` 但实际上,SQL*Loader默认每就是一条记录,所以我们可以这样: ```control LOAD DATA INFILE '/path/to/your/file.txt' APPEND INTO TABLE file_content TRAILING NULLCOLS ( line_content CHAR(4000) -- 将整读入line_content ) ``` 然后,在shell脚本中调用sqlldr: ```bash #!/bin/bash # 设置Oracle数据库连接信息 USER="your_username" PASS="your_password" HOST="localhost" PORT="1521" SERVICE="ORCLPDB1" # 输入文件路径 FILE_PATH="/path/to/your/file.txt" # 控制文件路径 CTL_FILE="load.ctl" # 调用sqlldr sqlldr userid=$USER/$PASS@//$HOST:$PORT/$SERVICE control=$CTL_FILE data=$FILE_PATH ``` 注意:使用SQL*Loader需要安装Oracle客户端(包含sqlldr工具)。在Docker容器中,如果容器内没有sqlldr,则不能使用。或者,你可以在宿主机安装Oracle客户端。 9. 考虑到用户要求使用shell脚本插入,并且没有指定文件大小,我们提供了两种方法:一种是使用sqlplus逐插入(适用于小文件),另一种是使用sqlldr(适用于大文件)。 10. 如果选择使用sqlplus并且文件较大,可以优化为批量插入(例如使用PL/SQL集合),但这需要更复杂的脚本。 根据用户需求,这我们重点放在shell脚本调用sqlplus逐插入的方法,因为这是直接使用shell脚本。同时,我们也提供了使用SQL*Loader的备选方案。 最后,根据指令,我们需要生成相关问题。 注意:在回答中,我们引用了引用[1]和引用[3]的内容,但主要参考的是用户当前的问题。</think>### 通过 Shell 脚本将文件内容写入 Oracle 数据库 以下是使用 Shell 脚本将文件内容插入 Oracle 数据库的完整解决方案,包含两种常用方法: --- ### 方法 1:使用 SQL*Loader(推荐) 这是 Oracle 官方推荐的高效批量导入工具,适合大数据量场景。 #### 步骤: 1. **创建控制文件** (`load.ctl`) ```control LOAD DATA INFILE '/path/to/input_file.csv' -- 输入文件路径 APPEND INTO TABLE target_table -- 目标表名 FIELDS TERMINATED BY ',' -- 字段分隔符 OPTIONALLY ENCLOSED BY '"' -- 文本限定符 TRAILING NULLCOLS ( col1, -- 列名1 col2, -- 列名2 col3 -- 列名3 ) ``` 2. **创建 Shell 脚本** (`load_data.sh`) ```bash #!/bin/bash # Oracle 连接信息 USER="your_username" PASSWORD="your_password" HOST="localhost" PORT="1521" SERVICE="ORCLPDB1" # 根据引用[1]中的容器配置 # 输入文件和控制文件路径 DATA_FILE="/path/to/input_file.csv" CTL_FILE="/path/to/load.ctl" # 执 SQL*Loader sqlldr userid=$USER/$PASSWORD@//$HOST:$PORT/$SERVICE \ control=$CTL_FILE \ data=$DATA_FILE \ log=load_log.log \ bad=bad_records.bad \ discard=discarded.dsc # 检查执结果 if [ $? -eq 0 ]; then echo "数据加载成功! 日志: load_log.log" else echo "数据加载失败! 请检查日志" fi ``` 3. **运脚本** ```bash chmod +x load_data.sh ./load_data.sh ``` --- ### 方法 2:使用 SQL*Plus(适合小数据量) 通过 Shell 脚本生成 SQL 插入语句并执。 #### Shell 脚本示例 (`insert_data.sh`) ```bash #!/bin/bash # Oracle 连接信息 CONN_STR="your_username/your_password@//localhost:1521/ORCLPDB1" # 引用[1] # 输入文件路径 INPUT_FILE="/path/to/data.txt" # 创建临时 SQL 文件 SQL_FILE="/tmp/insert_$$.sql" # 生成 SQL 插入语句 echo "INSERT INTO target_table (col1, col2) VALUES" > $SQL_FILE while IFS=, read -r field1 field2 do echo "('$field1', '$field2')," >> $SQL_FILE done < $INPUT_FILE # 添加提交命令并移除末尾逗号 sed -i '$ s/,$/;/' $SQL_FILE echo "COMMIT;" >> $SQL_FILE echo "EXIT;" >> $SQL_FILE # 执 SQL 文件 sqlplus -s $CONN_STR @$SQL_FILE # 清理临时文件 rm $SQL_FILE ``` --- ### 关键注意事项 1. **文件预处理** - 使用 `sed`/`awk` 处理特殊字符(如单引号): ```bash sed "s/'/''/g" input_file.csv > processed.csv # 转义单引号 ``` - 转换换符:`dos2unix input_file.csv` 2. **性能优化** - 大数据量优先使用 SQL*Loader(速度比单条 INSERT 快 10-100 倍) - 在 SQL*Loader 中设置 `DIRECT=true` 启用直接路径加载 - 分批提交事务(每 1000 COMMIT 一次) 3. **错误处理** ```bash # 检查 SQL*Loader 返回码 if [ $? != 0 ]; then echo "错误代码: $?" | mail -s "数据加载失败" admin@example.com fi ``` 4. **权限配置** - 确保 Oracle 用户有 INSERT 权限(参考引用[3]的授权语句) - 创建数据库目录对象(如需加载外部文件): ```sql CREATE DIRECTORY data_dir AS '/opt/oracle/data'; GRANT READ, WRITE ON DIRECTORY data_dir TO your_user; ``` > **提示**:对于容器化 Oracle(如引用[1]),需确保文件路径在容器内可访问,或使用 Docker 卷映射: > `docker run ... -v /host/path:/container/path ...` --- ### 示例文件格式 **输入文件** (`data.csv`): ```csv 1001,"John Doe","IT" 1002,"Jane Smith","HR" 1003,"Bob Lee","Finance" ``` **对应表结构**: ```sql CREATE TABLE employees ( id NUMBER, name VARCHAR2(50), dept VARCHAR2(20) ); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值