2017-10-12 6 views
0

1つのクエリを実行する必要があります。クエリを実行する前に、次の2つの条件を確認する必要があります。 1)テーブルの行数は0です 2)テーブル列が1つ存在します。チェックする方法PL/SQLでクエリを実行する前に、列が存在し、テーブルの行数が集計されている場合

だから、誰かがすることができ、次のように私は手順を書いた私の要件に基づか

DECLARE 
    rowCount INT; 
    column_not_exists exception; 
    pragma exception_init (column_not_exists , -00904); 
BEGIN 
SELECT count(*) INTO rowCount FROM Settings; 
IF (rowCount = 0) THEN 
Insert into Settings (ID,PROCESSID,AREA) select ID,PROCESSID,AREA from POINT WHERE CLASSNAME = 'ENDPOINT' and PROCESSID IS NOT NULL; 
END IF; 
exception WHEN column_not_exists THEN NULL; 
END; 
/

しかし、どういうわけか、例外が処理されず、まだ私はログに

PL/SQL: ORA-00904: "PROCESSID": invalid identifier 
ORA-06550: line 8, column 1: 
PL/SQL: SQL Statement ignored 

をエラーメッセージを見ることができます両方の条件を確認するために私をここに助けてください。

+0

行数については、dba_tab_statisticsを使用できます(行数が重要な場合は適切ではない場合は、最後のデータベース収集統計からの表に関する統計情報が表示されます)。列については、dba_tab_columnsからテーブルの列をクエリし、その列の存在を確認できます。 –

+0

あなたのデータベースからポイント(テーブル)構造を拡張することができます! –

+1

ora-00904はコンパイル時例外です。例外セクションは実行時例外をトラップします。簡単に言えば、ora-00904は静的SQLに対してはトラップできませんが、動的SQLに対してはトラップできます。とにかく静的SQLの例外を処理する意味がありません。データを挿入/選択するテーブルの構造を知っておく必要があります。 –

答えて

0

システムビューALL_TAB_COLUMNSを使用した方がよい(もちろん、アクセスするには特権が必要です)。また、Oracle動的SQL文「EXECUTE IMMEDIATE」を使用する必要があります。そうしないと、コードはコンパイルされません。 下(t.OWNER)= '所有者'、 下(t.TABLE_NAME)= 'ポイント'

コード:

私はここにあなたのコードを変更してある

、それに応じてこれらの場所を交換してください

declare 
    rowcount int; 
    l_cnt number; 
begin 
    select count(*) into rowcount from settings; 
    if (rowcount = 0) then 
    select count(*) into l_cnt from ALL_TAB_COLUMNS t 
      where lower(t.OWNER)='owner' and lower(t.TABLE_NAME)='point' 
      and lower(t.COLUMN_NAME) in ('processid','area'); 
    if l_cnt = 2 then 
     execute immediate 'insert into settings 
     (id, processid, area) 
     select id, processid, area 
      from point 
     where classname = ''ENDPOINT'' 
      and processid is not null'; 
    end if; 
    end if; 

end; 
+1

ちょうど注:ALL_TAB_COLSにはパーミッションは必要ありません。自動的にアクセス権がありますが、権限が必要なのはDBA_TAB_COLSです。 USER_TAB_COLSには、所有するすべての表とビューが含まれますが、OWNER列はありません。 ALL_TAB_COLSには、他のスキーマの表を含む、アクセス権を持つすべての表とビューが含まれます。このため、OWNER列があります。 DBA_TAB_COLSには、データベース内のすべての表およびビューが含まれます。 –

関連する問題