0

選択クエリを介して単一の変数に複数の値をフェッチし、その変数の値を単一の値のみを持つ別の変数と比較する必要があります。

PL/SQL プログラミングは初めてです。このフォーラムを検索したところ、TYPE/ コレクションを使用した結果が得られましたが、コードで同じものを使用する方法がわかりません。

以下は私のコードのスニペットです:

CREATE OR REPLACE PROCEDURE MNTH_SNAPSHOT AS
  arg1 varchar2(10) ;
  TYPE snap IS TABLE OF GDWARC_JPN.DIM_ORG_UNIT_HIST.snapshot_period%TYPE;
BEGIN 
  SELECT (to_char(trunc(sysdate, 'MM'), 'MON-yyyy')) INTO arg1 FROM dual; 
  SELECT (to_char(snapshot_period,'MON-yyyy')) BULK collect into snap FROM GDWARC_JPN.DIM_ORG_UNIT_HIST; -- multiple values like DEC-2016, JAN-2016 etc . snapshot_period is date column 

  if arg1 in (snap ) then
    execute immediate 'alter table GDWARC_JPN.DIM_ORG_UNIT_HIST truncate partition arg1';
4

3 に答える 3

0

Member of clause を使用して、要素がコレクションの一部であるかどうかをテストできます

    if some_value member of arg1 then 
`      dbms_output.put_line('Member') ;
    end if ;

あなたが投稿したコードには、コレクション変数の宣言と使用に関連するいくつかの問題があります。以下はより正しいバージョンです。

CREATE OR REPLACE PROCEDURE MNTH_SNAPSHOT AS
  arg1 varchar2(10) ;
  TYPE snap IS TABLE OF GDWARC_JPN.DIM_ORG_UNIT_HIST.snapshot_period%TYPE;
  snap_tab snap := snap() ; --declare a new collection variable and use this 
BEGIN 
  SELECT (to_char(trunc(sysdate, 'MM'), 'MON-yyyy')) INTO arg1 FROM dual; 
  SELECT (to_char(snapshot_period,'MON-yyyy')) BULK collect into snap_tab/*changed*/ FROM GDWARC_JPN.DIM_ORG_UNIT_HIST; -- multiple values like DEC-2016, JAN-2016 etc . snapshot_period is date column 

  if arg1 member of snap_tab /*changed*/ then
    execute immediate 'alter table GDWARC_JPN.DIM_ORG_UNIT_HIST truncate partition arg1';
于 2016-12-09T07:28:36.143 に答える
0

コメントできないので、新しい回答を書きます

Prabhat に感謝します。コードは正常にコンパイルされましたが、proc を実行しようとすると、次のようなエラーがスローされました: エラー レポート - ORA-01858: 数値が予期されていた場所に数値以外の文字が見つかりました ORA-06512: "GDWARC_JPN.MNTH_SNAPSHOT" で、 9 行目 ORA-06512: 1 行目 01858.00000 - 「数値が必要な場所に数値以外の文字が見つかりました」 助けてください。

あなたの問題は、異なるデータ型を使用していることです。

SELECT (to_char(snapshot_period,'MON-yyyy')) BULK collect into snap_tab/*changed*/ FROM GDWARC_JPN.DIM_ORG_UNIT_HIST;

まず、date を使用し、それを char に変換してから、再度 date に保存します。これをコンパイルする方法がわからない

SELECT (to_char(trunc(sysdate, 'MM'), 'MON-yyyy')) INTO arg1 FROM dual; 

sysdate を目的の形式に変換して varchar 変数に保存すると、日付ではなくなります。次に、それを日付と比較していますが、日付にフォーマットがあるため、認識されません。したがって、すべての変数で日付を使用し、 TRUNC オプションを使用して月と年のみを抽出します (テーブルのメンバーをメンバーのメンバーにキャストできるかどうかはわかりませんが、その状況では for を使用する必要があるかもしれません)。テーブルを varchar 型に

CREATE OR REPLACE PROCEDURE MNTH_SNAPSHOT AS
  arg1 varchar2(10) ;
  TYPE snap IS TABLE OF varchar2(10);
  snap_tab snap := snap() ; --declare a new collection variable and use this 
BEGIN 
  SELECT (to_char(trunc(sysdate, 'MM'), 'MON-yyyy')) INTO arg1 FROM dual; 
  SELECT (to_char(snapshot_period,'MON-yyyy')) BULK collect into snap_tab/*changed*/ FROM GDWARC_JPN.DIM_ORG_UNIT_HIST; -- multiple values like DEC-2016, JAN-2016 etc . snapshot_period is date column 

  if arg1 member of snap_tab /*changed*/ then
    execute immediate 'alter table GDWARC_JPN.DIM_ORG_UNIT_HIST truncate partition arg1';
于 2016-12-10T00:16:55.193 に答える