无法写入Oracle外部表

flmtquvp  于 2023-10-16  发布在  Oracle
关注(0)|答案(3)|浏览(113)

我定义了一个非常简单的Oracle外部表,我可以从中选择数据:

CREATE TABLE brianl.billdata_daily2
(
    account   VARCHAR2 (30)
)
ORGANIZATION EXTERNAL
    (TYPE oracle_loader
          DEFAULT DIRECTORY cifs_dir
          LOCATION ('mymeter_daily_bills.csv'));

我把一些示例行放入其中,并能够成功地检索它们:

SELECT *
  FROM brianl.billdata_daily2;

不幸的是,当我试图写信给他们时,我得到了一个错误:

INSERT INTO brianl.billdata_daily2 (account)
    SELECT ('A')
      FROM DUAL;

ORA-30657:外部组织表不支持操作
我对cifs_dir目录有读、写、执行权限,为了参数起见,我为文件系统目录添加了Oracle java文件I/O权限,但我仍然得到这个错误。有人有办法解决这个问题吗?

tag5nh1u

tag5nh1u1#

Oracle允许对外部表中的数据进行只读访问,这意味着不可能进行DML操作(UPDATE、UPDATE或DELETE)。
但是,您可以使用CTAS创建新表,并在新创建的表中执行DML。

参考文献:

  1. External Table
    1.使用外部表加载和卸载数据
g0czyy6m

g0czyy6m2#

您可以编写(或创建)DATAPUMP格式的外部表。不能以ORACLE_LOADER格式创建外部表。不能对这两种格式执行DML。

sshcrbum

sshcrbum3#

当然是可能的:
在外部表上创建视图:

create view v_billdata_daily2 as select * from billdata_daily2;

在该视图上创建一个触发器而不是insert(作为示例),如下所示:

create or replace trigger tg_billdata_daily2_i instead of insert on v_billdata_daily2
declare
    handler_ utl_file.file_type;
begin
    handler_ := utl_file.fopen('CIFS_DIR', 'mymeter_daily_bills.csv', 'a');
    utl_file.put_line(handler_, :new.account);
    utl_file.fclose(handler_);
end;
/

以表格形式插入到视图中:

insert into v_billdata_daily2 values('It seams impossible');

相关问题