导入csv文件到oracle数据库

ux6nzvsh  于 12个月前  发布在  Oracle
关注(0)|答案(1)|浏览(118)

我想导入一个.csv文件到下面的oracle数据库表,但它不工作,日志文件是空的,没有输出。
我的shell脚本如下:
日志文件也总是空的
下面是.csv文件的示例

SendingFri,LoggingTime,RenewalNumber,TransactionType,Status,Duration
22997186945,2023-07-25-00:05:56.301,23900032093333,Payment,SUCCESS,null
22951547347,2023-07-25-00:04:12.794,23900336289912,Payment,SUCCESS,null
#!/bin/bash

# Oracle Database Connection Details
USERNAME='abc'
PASSWORD="abc"
HOST="myip"
PORT="1521"
SERVICE_NAME="abc"

# CSV File Details
CSV_FILE="/home/hdegboevi/modified5.csv"
TABLE_NAME="myCANALINFORMATION"

# Control File
CONTROL_FILE="my_control_file.ctl"

# Create a control file
cat <<EOF > $CONTROL_FILE
LOAD DATA
INFILE '$CSV_FILE'
APPEND INTO TABLE $TABLE_NAME
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
SENDINGFRI,
LOGGINGTIME,
RENEWALNUMBER,
TRANSACTIONTYPE,
STATUS,
DURATON
)
EOF

# Run SQL*Loader
sqlldr $USERNAME/$PASSWORD@$HOST:$PORT/$SERVICE_NAME control=$CONTROL_FILE log=/home/hdegboevi/sqlldr.log  /home/hdegboevi

# Check the log for errors
if grep "ORA-" sqlldr.log; then
    echo "Error occurred during data load. Please check sqlldr.log for details."
else
    echo "Data loaded successfully."
fi
r1wp621o

r1wp621o1#

您应该已过帐目标表说明;如果没有它,我们必须猜测数据类型。我的幸运猜测(根据样本数据):

SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 SENDINGFRI                                         NUMBER
 LOGGINGTIME                                        TIMESTAMP(6)
 RENEWALNUMBER                                      NUMBER
 TRANSACTIONTYPE                                    VARCHAR2(20)
 STATUS                                             VARCHAR2(10)
 DURATION                                           VARCHAR2(20)

SQL>

这可能是错的duration列听起来好像你想把例如。一个数字(something took 2 seconds to complete),但示例数据表明您正在向其中插入字符串(在此上下文中,null是一个字符串)。
用你写的一个控制文件,结果是(在我的数据库里)

Record 1: Rejected - Error on table TEST, column LOGGINGTIME.
ORA-01843: not a valid month

控制文件,已修复:

LOAD DATA
INFILE *
REPLACE
INTO TABLE test
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
SENDINGFRI,
LOGGINGTIME "to_timestamp(:loggingtime, 'yyyy-mm-dd-hh24:mi:ss.ff')",
RENEWALNUMBER,
TRANSACTIONTYPE,
STATUS,
DURATION
)

begindata
22997186945,2023-07-25-00:05:56.301,23900032093333,Payment,SUCCESS,null
22951547347,2023-07-25-00:04:12.794,23900336289912,Payment,SUCCESS,null

加载会话:

SQL> $sqlldr scott/tiger@orcl control=test49.ctl log=test49.log

SQL*Loader: Release 18.0.0.0.0 - Production on Čet Kol 17 14:23:09 2023
Version 18.5.0.0.0

Copyright (c) 1982, 2018, Oracle and/or its affiliates.  All rights reserved.

Path used:      Conventional
Commit point reached - logical record count 1
Commit point reached - logical record count 2

Table TEST:
  2 Rows successfully loaded.

Check the log file:
  test49.log
for more information about the load.

测试结果:

SQL> select * from test;

   SENDINGFRI LOGGINGTIME                  RENEWALNUMBER TRANSACTIONTYPE      STATUS     DURATION
------------- ------------------------- ---------------- -------------------- ---------- --------------------
  22997186945 25.07.23 00:05:56,301000    23900032093333 Payment              SUCCESS    null
  22951547347 25.07.23 00:04:12,794000    23900336289912 Payment              SUCCESS    null

SQL>

数据在这里。
我建议你先把工作的那一部分做正确(即。加载本身),然后创建shell脚本。我无法提供帮助,我不使用任何类型的Unix操作系统。

[编辑,在您发布表描述后]

所有的列都是varchar2。甚至更简单。

SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 SENDINGFRI                                         VARCHAR2(30)
 LOGGINGTIME                                        VARCHAR2(30)
 RENEWALNUMBER                                      VARCHAR2(30)
 TRANSACTIONTYPE                                    VARCHAR2(30)
 STATUS                                             VARCHAR2(30)
 DURATON                                            VARCHAR2(30)

SQL>

(我以为这是一个错字,“duraton”对。“duration”;看起来真的是“duraton”,不管那可能是什么)。
控制文件很简单:

LOAD DATA
INFILE *
REPLACE
INTO TABLE test
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
SENDINGFRI,
LOGGINGTIME,
RENEWALNUMBER,
TRANSACTIONTYPE,
STATUS,
DURATON
)

begindata
22997186945,2023-07-25-00:05:56.301,23900032093333,Payment,SUCCESS,null
22951547347,2023-07-25-00:04:12.794,23900336289912,Payment,SUCCESS,null

加载会话:

SQL> $sqlldr scott/tiger@orcl control=test49a.ctl log=test49a.log

SQL*Loader: Release 18.0.0.0.0 - Production on Čet Kol 17 14:48:15 2023
Version 18.5.0.0.0

Copyright (c) 1982, 2018, Oracle and/or its affiliates.  All rights reserved.

Path used:      Conventional
Commit point reached - logical record count 1
Commit point reached - logical record count 2

Table TEST:
  2 Rows successfully loaded.

Check the log file:
  test49a.log
for more information about the load.

测试结果:

SQL> select * from test;

SENDINGFRI   LOGGINGTIME               RENEWALNUMBER   TRANSACTIONTYPE STATUS     DURATON
------------ ------------------------- --------------- --------------- ---------- ----------
22997186945  2023-07-25-00:05:56.301   23900032093333  Payment         SUCCESS    null
22951547347  2023-07-25-00:04:12.794   23900336289912  Payment         SUCCESS    null

SQL>

相关问题