循环使用bfile oracle从一个表到另一个表进行大容量插入

时间:2018-08-03 01:52:44

标签: oracle oracle-sqldeveloper

  • 表1
    • BF varchar2(255),
    • 名称varchar2(100),
    • 身份证号码
  • 表2
    • BF BFile,
    • 名称varchar2(100),
    • 身份证号码

我正在将Table1中的20000多行插入到Table2中。我收到错误消息不一致数据类型,我想将BF保持为BFile。如何在没有不一致的数据类型错误的情况下做到这一点?

下面是我的代码。

declare 

  CURSOR c1
    IS
       SELECT name, id, address,  BF
        FROM table1 a

begin  
  for i in 1..20000 loop  
    for l_record in c1 loop
      insert into Table2 (name, id, address,  BF) 
      values (''' ||name||''', '|| id||', '''||   BF ||'); 
    end loop;      
  end loop;  
end;  
/

1 个答案:

答案 0 :(得分:0)

摘自文档:

  

您使用BFILE数据类型在操作中存储大型二进制对象   数据库外部的系统文件。每个BFILE变量都存储一个文件   定位器,它指向服务器上的大型二进制文件。的   定位器包含目录别名,该目录别名指定完整路径名。

您没有说table1.bf栏中写的内容,所以我想它是那个二进制对象(例如图片)的名称。如果是这样,为什么需要循环和游标?简单的INSERT应该可以做到。此外,似乎您迷失了所有那些用单引号引起来的引号(我确实如此)。

无论如何:这是一个例子。正如您提到的,我正在创建两个表。其中一个包含一行,随后的INSERT将其插入到另一个表中。 ROWNUM < 20000在此处将插入限制为20000行。我认为您的table1表中还有更多这些内容。

首先,以SYS连接,我将创建一个目录(稍后在insert into table2期间将需要它):

SQL> show user
USER is "SYS"
SQL> create directory my_dir as 'c:\temp';

Directory created.

SQL> grant read, write on directory my_dir to scott;

Grant succeeded.

scott身份连接并执行操作。插入使用BFILENAME函数

  

返回与服务器文件系统上的物理LOB二进制文件关联的BFILE定位器。

它接受两个参数:

  • 目录(我们在上面创建)
  • 文件名

SQL> connect scott/tiger@xe
Connected.
SQL> create table table1 (bf varchar2(255), name varchar2(10), id number);

Table created.

SQL> create table table2 (bf bfile, name varchar2(100), id number);

Table created.

SQL> insert into table1 values ('littlefoot.jpg', 'lf', 1);

1 row created.

SQL>
SQL> insert into table2 (bf, name, id)
  2    select bfilename('EXT_DIR', bf), name, id from table1
  3    where rownum < 20000;

1 row created.

SQL> select * From table2;

BF                                                 NAME          ID
-------------------------------------------------- ---------- -----
bfilename('EXT_DIR', 'littlefoot.jpg')             lf             1

SQL>