我对 oracle 和 sql 不太熟悉,想问一些问题。假设我在 txt 数据上有这样的数据:
Agt代码 | 销售 |
---|---|
000001 | 20,000 |
000002 | 25,000 |
我想将其插入到具有如下结构的表(sales_master)中
|代理代码 |代理名称 |工作 |销售|
对于 Agt 名称和作业信息已经位于数据库的另一个表 (agt_info) 中,如下所示:
Agt代码 | 代理姓名 | 工作 |
---|---|---|
000001 | 约翰·多伊 | 营销 |
000002 | 乔·肖恩 | 销售 |
那么如何为该数据创建插入语句呢?而因为我有5000行数据要插入,如何高效插入呢?
我想直接创建一条插入语句,因为这只是一次,但因为有很多数据需要查看其他表,我认为处理它会占用很多资源。
提前谢谢您。
此示例展示了如何使用外部表进行操作。
这是目标表(所有数据应插入此处):
SQL> desc sales_master
Name Null? Type
----------------------------------------- -------- ----------------------------
AGT_CODE VARCHAR2(6)
AGT_NAME VARCHAR2(20)
JOB VARCHAR2(20)
SALES NUMBER
这是您已有的表,它有一些数据:
SQL> select * from agt_info;
AGT_CO AGT_NAME JOB
------ -------------------- --------------------
000001 John Doe Marketing
000002 Joe Sean Sales
为了能够使用外部表,您必须与 DBA 交谈
read
和 write
)我不是 DBA,也没有权限进行现场演示,但是 - 如果您实际上是 DBA - 这就是您应该做的。以 SYS
身份连接并运行以下语句(当然,您可以使用自己的目录名称和用户):
create directory ext_dir as 'c:\temp';
grant read, write on directory ext_dir to scott;
然后,以将加载数据的用户身份进行连接。就我而言,那就是
scott
:
SQL> show user
USER is "SCOTT"
SQL> select directory_name from all_directories;
DIRECTORY_NAME
------------------------------
EXT_DIR
样本数据存储在
txt_data.txt
文件中,该文件位于数据库服务器上的
c:\temp
目录中。其内容是000001,20000
000002,25000
创建外部表:
SQL> create table txt_data
2 (agt_code varchar2(6),
3 sales varchar2(10)
4 )
5 organization external
6 (type oracle_loader
7 default directory ext_dir
8 access parameters
9 (records delimited by newline
10 fields terminated by ','
11 missing field values are null
12 (agt_code,
13 sales
14 )
15 )
16 location ('txt_data.txt')
17 );
Table created.
我能看到任何数据吗?
SQL> select * from txt_data;
AGT_CO SALES
------ ----------
000001 20000
000002 25000
好的;剩下的很简单:编写一个
insert
语句,连接来自
agt_info
和 txt_data
的数据:SQL> insert into sales_master (agt_code, agt_name, job, sales)
2 select t.agt_code, i.agt_name, i.job, to_number(replace(t.sales, chr(13)))
3 from txt_data t join agt_info i on i.agt_code = t.agt_code;
2 rows created.
最终结果:
SQL> select * from sales_master;
AGT_CO AGT_NAME JOB SALES
------ -------------------- -------------------- ----------
000001 John Doe Marketing 20000
000002 Joe Sean Sales 25000
SQL>