PL / SQL触发器将数据写入txt文件

时间:2015-12-05 00:07:17

标签: sql oracle plsql triggers

我遇到这个问题,每次签出电影的所有副本时都会写入文本行。他们希望在文本文件中包含日期,电影ID和电影库存数量。我使用游标从表中获取数据,并使用UTL_file.FILE_TYPE将输出写入文本文件。触发器编译然而我没有写任何文件。

create or replace trigger zeromovies_write
After update on mm_movie    

DECLARE

c_id mm_movie.movie_id%type;
c_qty mm_movie.movie_qty%type;
CURSOR c_movie is 
SELECT movie_id, movie_qty FROM mm_movie;
fh UTL_FILE.FILE_TYPE;
v_date DATE;
total VARCHAR2(50);

BEGIN

OPEN c_movie;
LOOP
  FETCH c_movie into c_id, c_qty;
  EXIT WHEN c_movie%notfound;
END LOOP;
if c_qty = 0 THEN
select sysdate into v_date from dual;
total := (c_id || c_qty || v_date);
fh := UTL_FILE.FOPEN('ORA_FILES', 'checkout.txt', 'w');
UTL_FILE.PUT_LINE(fh, total);
end if;
UTL_FILE.FCLOSE(fh);
close c_movie;

END;

然后我使用以下代码更新表(将qty设置为0)但写不会发生。

UPDATE mm_movie
SET movie_qty = 0
WHERE movie_id = 7;

UPDATE mm_movie 
SET movie_qty = 0
WHERE movie_id = 8;

1 个答案:

答案 0 :(得分:1)

  1. 这看起来像是一个非常糟糕的主意。
  2. 你能成功地在触发器外写一个文件吗? (匿名PL / SQL或存储过程)
  3. FOPEN模式'w'每次都会打开一个新文件,不是吗?
  4. Oracle有锁和什么不兼容。如果同时从触发器的两次调用中写入文件,事情可能不会很好。
  5. 您的代码无特定顺序遍历mm_movie的每一行。然后测试最后一行的数量是否为零。 (最后一次获取是不确定的。)因此可能存在数量为零的行,但只要零数量行不是最后一行,您的零处理逻辑就不会被激活。

    此触发器遍历所有记录,而不仅仅是已更改的记录。如果最后一行确实没有数量,那么它可能已经设置为零之前已经多次写入文件。

    我是否提到这看起来像是一个极其糟糕的主意?

    将其记录到表格中。对表的插入在并发加载下运行良好。用于每个行光标和:NEW伪记录。