-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;

当我执行代码时,我的程序被创建。但不起作用。当我尝试编译该过程时,出现以下错误。错误(7,1):PLS-00103:在预期以下之一时遇到符号“WITH”:* & = - + ; </ > at in is mod 余数 not rem <> or != or ~= >= <= <> and or like2 like4 likec || 多集成员子多集...

如果我使用开始部分执行此代码,它对我来说很好。

4

2 回答 2

0

只需使用代码格式化程序,错误就会直接跳到您的眼前。在 的行上time_to_stay,你省略了最后的 ;

于 2013-02-11T10:30:49.970 回答
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.
于 2013-02-11T10:35:38.260 回答