2013-02-11 103 views
-1
create or replace procedure proc 
    as 
begin 
declare 
time_to_stay number(3):=90 
    with date_partitions as 
    (select dbms_xmlgen.getxmltype(' 
    select p.table_owner, 
    p.table_name, 
    p.high_value 
    from all_part_key_columns k, 
    all_tab_cols c, 
    all_tab_partitions p 
    where k.owner = c.owner 
     and k.column_name = c.column_name 
     and k.name = c.table_name 
     and k.owner = p.table_owner 
     and k.name = p.table_name 
     and (c.data_type = ''DATE'' or 
     c.data_type like ''TIMESTAMP%'')') 
     as xml 
     from dual) 

    SELECT x.* 
     FROM date_partitions p, 
     xmltable('/ROWSET/ROW' 
     passing p.xml 
     columns table_owner varchar2(30) 
       path '/ROW/TABLE_OWNER', 
       table_name varchar2(30) 
       path '/ROW/TABLE_NAME', 
       high_value varchar2(30) 
       path '/ROW/HIGH_VALUE' 
      ) x 
        where to_date(substr(x.high_value, 
        instr(high_value, '''')+2, 
        19), 
      'yyyy-mm-dd hh24:mi:ss') <= sysdate-time_to_stay 
      end; 

當我執行代碼時,I過程被創建。但不起作用。當我嘗試編譯該過程時,出現以下錯誤。 錯誤(7,1):PLS-00103:遇到下列其中一項時遇到符號「WITH」:* & = - +;其中in是mod餘數不是rem <>或= =或= => = < = <>和或類似like2 like4 likec在||之間。 multiset成員submultiset ...在存儲過程中使用with clause

如果我與開始部分執行此代碼,它適用於我的罰款。

回答

0

你做了一些錯別字:

即:

您的加入

  1. DECLARE。這對存儲過程不是必需的。

  2. 您的time_to_stay需要在開始塊之前。

  3. time_to_stay上缺少分號。

  4. 你必須在那裏有for循環,因爲這個sql可以返回2+行。

這是一個只向緩衝區輸出信息的例子。

SQL> create or replace procedure proc 
    2 as 
    3 time_to_stay number(3):=90; 
    4 begin 
    5  for r_tab in (with date_partitions as 
    6     (select dbms_xmlgen.getxmltype(' 
    7      select p.table_owner, 
    8      p.table_name, 
    9      p.high_value 
10      from all_part_key_columns k, 
11      all_tab_cols c, 
12      all_tab_partitions p 
13      where k.owner = c.owner 
14       and k.column_name = c.column_name 
15       and k.name = c.table_name 
16       and k.owner = p.table_owner 
17       and k.name = p.table_name 
18       and (c.data_type = ''DATE'' or 
19       c.data_type like ''TIMESTAMP%'')') as xml 
20      from dual) 
21     select x.* 
22     from date_partitions p, 
23       xmltable('/ROWSET/ROW' passing p.xml columns table_owner varchar2(30) path 
24         '/ROW/TABLE_OWNER', table_name varchar2(30) path '/ROW/TABLE_NAME', 
25         high_value varchar2(30) path '/ROW/HIGH_VALUE') x 
26     where to_date(substr(x.high_value, instr(high_value, '''') + 2, 19), 
27         'yyyy-mm-dd hh24:mi:ss') <= sysdate - time_to_stay) 
28 loop 
29  dbms_output.put_line(r_tab.table_owner||','||r_tab.table_name||','||r_tab.high_value); 
30 end loop; 
31 end; 
32/

Procedure created. 
0

只要使用一個代碼格式化程序,錯誤就會直接跳到你的眼睛。在time_to_stay的行上,你省略了最後的;