ITPub博客

首页 > 数据库 > Oracle > 在ORACLE存储过程中创建临时表

在ORACLE存储过程中创建临时表

Oracle 作者:ITtomilk 时间:2015-12-01 15:55:10 0 删除 编辑

原文:http://www.blogjava.net/michaelcao/archive/2009/01/13/251185.html

在ORACLE存储过程中创建临时表

存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行

--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。


点击(此处)折叠或打开

  1. CREATE OR REPLACE PROCEDURE temptest
  2. (p_searchDate IN DATE)
  3. IS
  4. v_count INT;
  5. str varchar2(300);
  6. BEGIN
  7. v_count := 0;

  8. str:='drop table SETT_DAILYTEST';

  9. execute immediate str; ----使用动态SQL语句来执行删除表

  10. str:='CREATE GLOBAL TEMPORARY TABLE SETT_DAILYTEST ( NACCOUNTID NUMBER not null, NSUBACCOUNTID NUMBER not null) ON COMMIT PRESERVE ROWS';

  11. execute immediate str; ----使用动态SQL语句来执行新建表

  12. str:='insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance)';

  13. execute immediate str; ----使用动态SQL语句来执行插入数据

  14. END temptest;


上面建立一个临时表的存储过程

下面是执行一些操作,向临时表写数据。


点击(此处)折叠或打开

  1. CREATE OR REPLACE PROCEDURE PR_DAILYCHECK
  2. (
  3. p_Date IN DATE,
  4. p_Office IN INTEGER,
  5. p_Currency IN INTEGER,
  6. P_Check IN INTEGER,
  7. p_countNum OUT INTEGER)
  8. IS
  9. v_count INT;
  10. BEGIN
  11. v_count := 0;
  12. IF p_Date IS NULL THEN
  13. dbms_output.put_line('日期不能为空');
  14. ELSE
  15. IF P_Check = 1 THEN
  16. insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance where dtdate = p_Date);

  17. select count(sd.naccountid) into v_count 
  18. from sett_subaccount ss,sett_account sa,sett_dailytest sd
  19. where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
  20. AND sa.nofficeid = p_Office AND sa.ncurrencyid = p_Currency
  21. and rownum < 2;

  22. COMMIT;

  23. p_countNum := v_count;
  24. dbms_output.put_line(p_countNum);
  25. END IF;

  26. IF P_Check = 2 THEN
  27. insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance where dtdate = p_Date);

  28. select
  29. count(sd.naccountid) into v_count
  30. from sett_cfsubaccount ss,sett_account sa,sett_dailytest sd
  31. where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
  32. AND sa.nofficeid = p_Office AND sa.ncurrencyid = p_Currency
  33. and rownum < 2;
  34. COMMIT;
  35. p_countNum := v_count;
  36. dbms_output.put_line(p_countNum);
  37. END IF;
  38. END IF;
  39. END PR_DAILYCHECK;


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30260000/viewspace-1850649/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-05-25

  • 博文量
    42
  • 访问量
    78506