如何将csv文件加载到表中

时间:2017-05-10 10:38:19

标签: sql oracle plsql

早上好,我一直在尝试将数据从csv文件加载到表中,但是如果你有权创建新的目录对象,我发现了如何做到这一点。

我使用UTL_FILE和外部表两种方式在本地完成,但是,我需要特殊权限才能执行此操作。

但是,当我尝试在线进行时,我发现我没有这些特权,所以我想知道没有它们是否有办法做到这一点。

谢谢!

PS:两种方法如下:

CREATE TABLE TEST
(
  A varchar2(25);
  B number;
)

使用UTL_FILE:

PROCEDURE load AS
    F UTL_FILE.FILE_TYPE;
    V_LINE VARCHAR2(4000);
    v_A varchar2(25);
    v_B number;

BEGIN
    F := UTL_FILE.FOPEN (<directory>, '<csv file>', 'r');
    IF UTL_FILE.IS_OPEN(F) THEN
        LOOP
            BEGIN
                UTL_FILE.GET_LINE(F, V_LINE, 1000);

                IF V_LINE IS NULL THEN
                    EXIT;
                END IF;

                v_A  := REGEXP_SUBSTR(V_LINE, '[^;]+', 1, 1);
                v_B  := REGEXP_SUBSTR(V_LINE, '[^;]+', 1, 2);

                INSERT INTO test(v_A, v_B);
                COMMIT;
            EXCEPTION
                WHEN NO_DATA_FOUND THEN
                    EXIT;
            END;
        END LOOP;
    END IF;

    UTL_FILE.FCLOSE(F);
END load;

WITH外部表

PROCEDURE loadcsv AS
    A varchar2(25);
    B number;

BEGIN
    INSERT INTO test select * testload;
    COMMIT;
END loadcsv;

HAVING

CREATE TABLE testload 
(   
  A VARCHAR2(25)
  B number
) 
ORGANIZATION EXTERNAL 
( TYPE ORACLE_LOADER
  DEFAULT DIRECTORY "PRUEBAS"
  ACCESS PARAMETERS
  ( records delimited by newline
    fields terminated by ';'
  )
  LOCATION
  ( 'Log_CSV_REND_SICTG_20170507.csv'
  )
)
REJECT LIMIT UNLIMITED ;

1 个答案:

答案 0 :(得分:1)

您可能想尝试使用SQL Loader加载。它易于使用且速度非常快。您必须创建一个控制文件来描述如何加载数据,并且需要具有与您尝试加载的表相同的结构。对于你的情况,它可能看起来像这样。

<强> test.ctl

LOAD DATA
INFILE <yourfilepath>
APPEND INTO TABLE TEST
FIELDS TERMINATED BY ','
(
    A,
    B
)

然后,从命令行。

host sqlldr username/password control=youfolder\test.ctl 
log=yourfolder\test.log