现在要做个统计,牵涉到的表太多,所有现在想做个临时表存储统计数据,然后从该临时表中查询数据.
代码如下 :
PROCEDURE PROC_EXCUTE( 
i_zone_code IN VARCHAR2, --地区号
i_begin_date IN VARCHAR2, --开始日期
i_end_date IN VARCHAR2, --结束日期o_retcode OUT INTEGER, --返回码
o_retmsg OUT VARCHAR2 --返回描述

IS
UPDATE_CS refcur; --refcur已定义REF CURSOR
update_str varchar2(1000);
table_name varchar2(30);
v_create_sql varchar2(4000);
v_insert_clause VARCHAR2(60);
cursor_insert integer;
cntinsert number; 
V_RECORD_FOUND NUMBER(7); 
V_TOL_COUNT NUMBER(7);
V_TOL_SUM NUMBER(17);
V_CHECK_COUNT NUMBER(7);
V_CHECK_SUM NUMBER(17);
BEGIN
table_name := 'TEMP_REPORT'||i_zone_code;--每调用一次生产一次该表
v_create_sql := 'CREATE GLOBAL TEMPORARY TABLE '||table_name||' ( 
ZONE_CODE NUMBER(5) not null,
WORK_DATE VARCHAR2(8) not null,
BRANCH_CODE NUMBER(4) not null,
BANK_CODE NUMBER(5) not null,
TELLER_CODE NUMBER(5) not null,
TOL_COUNT1 NUMBER(7),
TOTAL_COUNT1 NUMBER(7),
TOL_SUM1 NUMBER(17),
TOTAL_SUM1 NUMBER(17),
CHECK_COUNT1 NUMBER(7),
CHECK_SUM1 NUMBER(17),
TOL_COUNT2 NUMBER(7),
TOTAL_COUNT2 NUMBER(7),
TOL_SUM2 NUMBER(17),
TOTAL_SUM2 NUMBER(17),
CHECK_COUNT2 NUMBER(7),
CHECK_SUM2 NUMBER(17),
TOL_COUNT3 NUMBER(7),
TOTAL_COUNT3 NUMBER(7),
TOL_SUM3 NUMBER(17),
TOTAL_SUM3 NUMBER(17),
CHECK_COUNT3 NUMBER(7),
CHECK_SUM3 NUMBER(17),
TOL_COUNT4 NUMBER(7),
TOTAL_COUNT4 NUMBER(7),
TOL_SUM4 NUMBER(17),
TOTAL_SUM4 NUMBER(17),
CHECK_COUNT4 NUMBER(7),
CHECK_SUM4 NUMBER(17),
TOL_COUNT5 NUMBER(7),
TOTAL_COUNT5 NUMBER(7),
TOL_SUM5 NUMBER(17),
TOTAL_SUM5 NUMBER(17),
CHECK_COUNT5 NUMBER(7),
CHECK_SUM5 NUMBER(17),
TOL_COUNT6 NUMBER(7),
TOTAL_COUNT6 NUMBER(7),
TOL_SUM6 NUMBER(17),
TOTAL_SUM6 NUMBER(17),
CHECK_COUNT6 NUMBER(7),
CHECK_SUM6 NUMBER(17),
TOL_COUNT NUMBER(7),
TOTAL_COUNT NUMBER(7),
TOL_SUM NUMBER(17),
TOTAL_SUM NUMBER(17),
CHECK_COUNT NUMBER(7),
CHECK_SUM NUMBER(17)
   ) ON COMMIT delete ROWS'; 
execute immediate v_create_sql;
/***下面为插入数据,为要显示的数据***/
v_insert_clause:='INSERT INTO '||table_name||
' SELECT DISTINCT ZONE_CODE,WORK_DATE,0,B_CODE,t_code,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
FROM STA
WHERE WORK_DATE BETWEEN '||i_begin_date||' and '||i_end_date||'
and zone_code='||i_zone_code; cursor_insert:=DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor_insert,v_insert_clause,2);
cntinsert:=DBMS_SQL.EXECUTE(cursor_insert);
DBMS_SQL.CLOSE_CURSOR(cursor_insert);update_str := 'SELECT ZONE_CODE, BRANCH_CODE, BANK_CODE, TELLER_CODE,
TOL_COUNT1,TOL_SUM1,TOTAL_COUNT1,TOTAL_SUM1,CHECK_COUNT1,CHECK_SUM1,
TOL_COUNT2,TOL_SUM2,TOTAL_COUNT2,TOTAL_SUM2,CHECK_COUNT2,CHECK_SUM2,
TOL_COUNT3,TOL_SUM3,TOTAL_COUNT3,TOTAL_SUM3,CHECK_COUNT3,CHECK_SUM3,
TOL_COUNT4,TOL_SUM4,TOTAL_COUNT4,TOTAL_SUM4,CHECK_COUNT4,CHECK_SUM4,
TOL_COUNT5,TOL_SUM5,TOTAL_COUNT5,TOTAL_SUM5,CHECK_COUNT5,CHECK_SUM5,
TOL_COUNT6,TOL_SUM6,TOTAL_COUNT6,TOTAL_SUM6,CHECK_COUNT6,CHECK_SUM6,
TOL_COUNT,TOTAL_COUNT,CHECK_COUNT
FROM '||table_name||
'order by zone_code,b_code,t_code
FOR UPDATE';
open UPDATE_CS for update_str;FOR UPD_RECORD IN UPDATE_CS LOOP /****这里会抱错,UPDATE_CS没定义****/
/***下面为更新刚刚插入的数据**/
.........
END LOOP;
COMMIT; o_retcode:=0; --默认处理成功
o_retmsg:='成功';
RETURN;EXCEPTION
....... end PROC_EXCUTE;

解决方案 »

  1.   

    这里不能用显示游标,但是可以用隐式的。对于显示的,必须用fetch方式,而不是for.
      

  2.   

    fetch的话,因为表结构还没确定,rowtype还不行,这里如何标示行的属性呢?
      

  3.   

    怎么会没有确定了,sql语句都是你构造的,怎么可能你不知道用什么,只不过麻烦一点而已。
      

  4.   

    一楼说的对,这里不能用游标,可以用隐式的,对于显示,必须用fetch方式,而不是for
      

  5.   

    对,显式的要四步
    定义
    open
    fetch
    close用隐式采用for