2017-08-29 142 views
0

我想在每个分区中对长时间的日期进行计数。所以我使用循环从我试图提取将在分区中使用的日期。但是我得到了错误。无法解决它。任何人都可以帮我解决这个问题,以及一些可能增加我的知识的文件吗?谢谢。在立即执行中使用变量

declare 
call_enddate date; 
totalcount number; 
begin 
for curdate in (WITH x(d) AS 
       (SELECT TO_DATE('2016-09-01', 'yyyy-mm-dd') 
        FROM dual 
       UNION ALL 
       SELECT d + interval '1' day 
        FROM x 
        WHERE d < TO_DATE('2017-09-05', 'yyyy-mm-dd')) 
       SELECT to_char (d, 'YYYYMMDD') Date_Char FROM x 
      ) 
loop 
     execute immediate 'select --parallel(32) 
        trunc(call_end_time), count(*) into call_enddate, totalcount 
        from lic_msc_data partition(p'||TO_CHAR(curdate.Date_Char,'YYYYMMDD'||')) 
        where sp_number like ''88016%'' 
        group by trunc(call_end_time)';       
dbms_output.put_line(call_enddate||'----'||totalcount); 
end loop; 
end; 

错误代码:

ORA-06550: line 19, column 55: 
PLS-00103: Encountered the symbol ";" when expecting one of the following: 
) , * & = - + </> at in is mod remainder not rem => 
<an exponent (**)> <> or != or ~= >= <= <> and or like 
+1

出于好奇,为什么你不能使用分区键作为分组的列?这样,你应该能够一次查询表格并获得你需要的结果。请你能告诉我们桌子是如何分区的吗? – Boneist

回答

1

问题是你已经嵌入到语句中的PL/SQL into条款。像这样做,而不是:

for curdate in (WITH x(d) AS 
       (SELECT DATE '2016-09-01' 
        FROM dual 
       UNION ALL 
       SELECT d + 1 
        FROM x 
        WHERE d < DATE '2017-09-05') 
       SELECT d FROM x 
      ) 
loop 
     execute immediate 'select --parallel(32) 
        trunc(call_end_time), count(*) 
        from lic_msc_data partition(p'||TO_CHAR(curdate.d,'YYYYMMDD'||')) 
        where sp_number like :n 
        group by trunc(call_end_time)' 
       into call_enddate, totalcount using '88016%';  

也许这是一个更优雅:

BEGIN 
    d := DATE '2016-09-01'; 
    LOOP 
     EXECUTE IMMEDIATE ... 
     dbms_output.put_line(call_enddate||'----'||totalcount); 
     d := d + 1; 
     EXIT WHEN d > DATE '2017-09-05'; 
    END LOOP; 
END; 

顺便说一句,--parallel(32)没有任何意义。你的意思是--+ parallel(32) resp。 /*+ parallel(32) */

+1

我想知道OP在服务器上有多少核心?我敢打赌,很多生产服务器没有足够的空间来处理那么多的并发线程。 – APC