在ORACLE DB SQL中,如何在只指定一次列的情况下执行“Insert all”语句?

ikfrs5lh  于 2023-04-11  发布在  Oracle
关注(0)|答案(1)|浏览(181)

现在我做以下事情

INSERT ALL 
    into "table" (col1, col2, col3....) values (val1,val2,val3...)
    ...
    select 1 from dual;

然而,这需要sql代码包含每个插入的列(我关心这个,因为我将此sql语句存储为.sql文件,并且它需要200mb,希望它更小)。有没有方法可以做到以下几点?假设所有插入都是针对同一个表:

INSERT ALL INTO "Table" (col1,col2,col3...)
    Values
    (val1,val2,val3...)
    (val1,val2,val3...)
    ...
    select 1 from dual;

因为这会将文件大小减少一半

2w3rbyxf

2w3rbyxf1#

如果所有数据都进入同一个表,为什么不只存储数据并将其加载到目标表比缓慢的逐个插入快得多
这里有一个使用external table的选项。它需要创建目录,并向将要使用它的用户授予读/写权限。DBA通常会创建它。因为我已经有了这个设置:

SQL> select directory_name, directory_path from dba_directories where directory_name = 'EXT_DIR';

DIRECTORY_NAME       DIRECTORY_PATH
-------------------- --------------------
EXT_DIR              c:\temp

我不会再这么做了询问您是否需要帮助。
示例数据存储在data_for_test.txt文件中,位于我的c:\temp目录中。为什么它会在我的本地PC上?因为我在笔记本电脑上运行Oracle 21 cXE。文件内容:

1, Little, 1000
2, Foot, 1200
3, Scott, 2000
4, Tiger, 1800

目标表:

SQL> create table test
  2    (id      number,
  3     name    varchar2(20),
  4     salary  number
  5    );

Table created.

SQL> select * From test;

no rows selected

创建外部表;它的作用就好像它是文件的“视图”:

SQL> create table ext_test
  2    (id     number,
  3     name   varchar2(20),
  4     salary number
  5    )
  6  organization external
  7    (type oracle_loader
  8     default directory ext_dir
  9     access parameters
 10       (records delimited by newline
 11        fields terminated by ','
 12        missing field values are null
 13       )
 14     location ('data_for_test.txt')
 15    )
 16  reject limit unlimited;

Table created.

从中选择:

SQL> select * From ext_test;

        ID NAME                     SALARY
---------- -------------------- ----------
         1  Little                    1000
         2  Foot                      1200
         3  Scott                     2000
         4  Tiger                     1800

很好,所有的东西都在这里。最后,将数据插入目标表:

SQL> insert into test (id, name, salary)
  2  select id, name, salary from ext_test;

4 rows created.

SQL> select * from test;

        ID NAME                     SALARY
---------- -------------------- ----------
         1  Little                    1000
         2  Foot                      1200
         3  Scott                     2000
         4  Tiger                     1800
    
SQL> truncate table test;

Table truncated.

SQL>

成交
另一个选择是使用更快的SQL*Loader实用程序。它的优点是-正如我所说的-非常快,它允许源数据文件存储在您自己的计算机上,无论数据库在哪里。
您需要一个控制文件,它 * 指示 * 实用程序做什么(在我的示例中,它的名称是test12.ctl):

load data
infile "c:\temp\data_for_test.txt"
replace
into table test
fields terminated by ','
trailing nullcols

(
  id,
  name,
  salary 
)

从操作系统命令提示符调用加载:

c:\temp>sqlldr scott/tiger@pdb1 control=test12.ctl log=test12.log

SQL*Loader: Release 21.0.0.0.0 - Production on Fri Apr 7 21:25:58 2023
Version 21.3.0.0.0

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

Path used:      Conventional
Commit point reached - logical record count 3
Commit point reached - logical record count 4

Table TEST:
  4 Rows successfully loaded.

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

结果:

c:\temp>sqlplus scott/tiger@pdb1

SQL*Plus: Release 21.0.0.0.0 - Production on Fri Apr 7 21:26:15 2023
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

Last Successful login time: Fri Apr 07 2023 21:26:00 +02:00

Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> select * from test;

        ID NAME                     SALARY
---------- -------------------- ----------
         1  Little                    1000
         2  Foot                      1200
         3  Scott                     2000
         4  Tiger                     1800

SQL>

现在你有两个选择。如果我是你,我会放弃你现在的选择。

相关问题