-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 <> または != または ~= >= <= <> and or like like2 like4 likec between || multiset メンバー submultiset ...

このコードを begin セクションで実行すると、問題なく動作します。

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. このSQLは2行以上を返す可能性があるため、そこにforループが必要です。

これは、情報をバッファに出力するだけの例です。

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 に答える