2017-08-29 52 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