当前位置:首页 > 问答 > 正文

plsql怎么用命令把txt文件导入数据库,步骤和方法都说清楚点

PL/SQL本身是Oracle数据库内部的一种程序语言,主要用于编写存储过程、触发器等,它并不直接具备从服务器操作系统上读取外部文件的能力,所谓的“用PL/SQL命令导入TXT文件”,实际上是通过PL/SQL调用一个名为“外部表”的数据库功能,或者使用PL/SQL程序读取数据库服务器上的文件,然后将数据插入到表中,这里会介绍两种最常用、最直接的方法。

*使用SQLLoader工具(最推荐、最经典的方法)**

SQLLoader是Oracle数据库自带的一个专门用于将外部文件数据加载到Oracle数据库表中的命令行工具,它功能强大,速度快,是完成这个任务的首选,这个方法的核心是创建一个“控制文件”(.ctl文件),告诉SQLLoader如何去做。

具体步骤如下:

  1. 准备TXT文件 假设你的TXT文件名为 employee_data.txt如下,每一列用逗号分隔(这种格式很常见,称为CSV,但本质也是TXT):

    1001,张三,技术部,5000
    1002,李四,销售部,6000
    1003,王五,技术部,5500
  2. 在数据库中创建目标表 你需要先在数据库中有一张表,用来存放TXT文件里的数据,表的结构需要和TXT文件的数据列对应,打开SQL*Plus、SQL Developer或其他数据库连接工具,执行建表SQL语句。 根据上面的TXT文件,我们可以创建这样一张表:

    CREATE TABLE employee (
        id NUMBER,
        name VARCHAR2(50),
        department VARCHAR2(50),
        salary NUMBER
    );
  3. 创建控制文件(.ctl文件) 这是最关键的一步,创建一个新的文本文件,命名为 load_data.ctl如下:

    LOAD DATA
    INFILE 'employee_data.txt'
    INTO TABLE employee
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
    (
        id,
        name,
        department,
        salary
    )

    逐行解释一下这个控制文件的意思:

    • LOAD DATA:声明要加载数据。
    • INFILE 'employee_data.txt':指定要导入的TXT文件的位置和名称,如果文件不在你运行命令的当前目录,需要写上完整路径,INFILE 'C:\data\employee_data.txt'
    • INTO TABLE employee:指定数据要导入到哪张数据库表。
    • FIELDS TERMINATED BY ',':指定TXT文件中每一行的列是用什么符号分隔的,这里是逗号,如果是制表符,就写 TERMINATED BY X'09'
    • OPTIONALLY ENCLOSED BY '"':表示字段值可能被双引号包围,加载器会自动去除引号,如果你的数据没有引号,这一句可以省略。
    • TRAILING NULLCOLS:这是一个很重要的选项,意思是如果TXT文件的某一行最后一列为空,也允许导入,防止报错。
    • (id, name, department, salary):列出目标表的列名,顺序要和TXT文件中的列顺序完全一致。
  4. *运行SQLLoader命令** 打开操作系统命令行窗口(Windows的CMD或Linux的Terminal),确保你的系统环境变量中已经配置了Oracle的客户端,这样就能使用 sqlldr 命令了。 基本的命令格式是:

    sqlldr userid=用户名/密码@数据库服务名 control=控制文件路径 log=日志文件路径

    举个例子:

    sqlldr userid=scott/tiger@orcl control=C:\load_data.ctl log=C:\load_log.log
    • userid:你的数据库用户名、密码和数据库服务名。
    • control:你刚才创建的 load_data.ctl 文件的完整路径。
    • log:指定一个日志文件路径,SQL*Loader会把加载的详细过程记录在这个文件里,比如成功导入了多少行,失败了多少行,失败的原因是什么。这个文件非常重要,如果导入出错,一定要查看这个日志。
  5. 检查结果 命令执行完毕后,会提示加载成功,这时,你可以登录数据库,查询 employee 表,看看数据是否已经成功导入,检查 load_log.log 文件,确认没有错误和丢弃的记录。

使用UTL_FILE包(更灵活,但更复杂)

这种方法是通过PL/SQL编程来实现的,它要求TXT文件必须放在数据库服务器上的某个特定目录下,而不是你自己的电脑上。

具体步骤如下:

  1. 在数据库服务器上创建目录对象 你需要有DBA权限的用户在数据库中创建一个“目录对象”,这个对象将数据库中的一个逻辑名称映射到服务器操作系统上的一个物理路径。

    CREATE OR REPLACE DIRECTORY TXT_DIR AS '/path/to/your/txt/files';

    CREATE OR REPLACE DIRECTORY DATA_DIR AS 'C:\import_data';

  2. 授权给用户 将对这个目录的读写权限授予给你的用户。

    GRANT READ, WRITE ON DIRECTORY TXT_DIR TO your_username;
  3. 准备TXT文件和创建目标表 这一步和方法一相同,确保TXT文件已经放在服务器上对应的物理路径(C:\import_data\employee_data.txt)下。

  4. 编写PL/SQL程序 下面是一个简单的PL/SQL匿名块,可以读取文件并插入数据。

    DECLARE
        file_handle UTL_FILE.FILE_TYPE;
        v_id NUMBER;
        v_name VARCHAR2(50);
        v_department VARCHAR2(50);
        v_salary NUMBER;
    BEGIN
        -- 打开文件
        file_handle := UTL_FILE.FOPEN('TXT_DIR', 'employee_data.txt', 'R');
        LOOP
            BEGIN
                -- 读取一行数据,按照分隔符拆分成字段
                UTL_FILE.GET_LINE(file_handle, v_text);
                -- 假设我们用逗号分隔,这里需要手动解析字符串
                -- 这是一个简化的例子,实际应用中可能需要更复杂的字符串处理函数(如REGEXP_SUBSTR)
                v_id := TO_NUMBER(SUBSTR(v_text, 1, INSTR(v_text, ',')-1));
                v_text := SUBSTR(v_text, INSTR(v_text, ',')+1);
                v_name := SUBSTR(v_text, 1, INSTR(v_text, ',')-1);
                ... -- 继续解析其他字段
                -- 将解析出的数据插入到数据库表
                INSERT INTO employee (id, name, department, salary) VALUES (v_id, v_name, v_department, v_salary);
            EXCEPTION
                WHEN NO_DATA_FOUND THEN
                    EXIT; -- 当没有更多行可读时退出循环
            END;
        END LOOP;
        -- 提交事务
        COMMIT;
        -- 关闭文件
        UTL_FILE.FCLOSE(file_handle);
    EXCEPTION
        WHEN OTHERS THEN
            UTL_FILE.FCLOSE(file_handle);
            RAISE;
    END;
    /

    注意: 这个PL/SQL块是一个原理性示例,实际编写起来比这个要复杂,特别是解析字符串的部分,对于规整的CSV文件,使用方法一的SQL*Loader是远比这个方法简单和高效的,UTL_FILE通常用于处理非标准格式的文件或需要复杂逻辑处理的场景。

总结与选择

  • *SQLLoader(方法一)强烈推荐给初学者和大多数常规需求**,它专为数据加载设计,配置简单,效率高,错误处理机制完善,只要写好控制文件,一行命令即可完成。
  • UTL_FILE包(方法二)适合有特殊需求的进阶用户,当数据加载过程需要复杂的业务逻辑判断、数据清洗或文件格式非常不规则时,可以用PL/SQL编程实现更精细的控制,缺点是文件必须在服务器上,编程更复杂。

对于你“把TXT文件导入数据库”的需求,请优先尝试使用*方法一(SQLLoader)**,它是完成这项任务最标准、最直接的工具。

plsql怎么用命令把txt文件导入数据库,步骤和方法都说清楚点