sql >> データベース >  >> RDS >> Oracle

どのコードがデータベースで対応しているのか

    CSVファイルに外部テーブルを作成します。これらは、SQLでOSファイルの内容をクエリできる非常に優れた機能です。 詳細

    次に、クエリを発行するだけです。

    select csv.id
           , case ( when tgt.id is null then 'invalid' else 'valid') end as valid_id
    from your_external_tab csv
           left join target_table tgt on (csv.id = tgt.id)
    

    パフォーマンスはコンテキストの問題です。この場合、CSV内のデータが変更される頻度と、データをクエリする必要がある頻度によって異なります。ファイルが1日に1回作成され、配信後に値を確認するだけでよい場合は、外部テーブルが最も効率的なソリューションです。ただし、このデータセットが永続的なリポジトリであり、頻繁にクエリを実行する必要がある場合は、ヒープテーブルへの書き込みのオーバーヘッドが明らかに正当化されます。

    私には、多数のIDと他の何も含まないCSVファイルは一時的なデータのように聞こえ、外部テーブルのユースケースに適しています。ただし、OPには、言及されていない追加の要件がある場合があります。

    これは、永続的なデータベースオブジェクトを作成する必要のない代替アプローチです。その結果、エレガントさが低下し、パフォーマンスが低下する可能性があります。

    UTL_FILEを使用してCSVファイルを手間をかけて読み取り、Oracleデータベースで使用できるはずの事前定義されたコレクション(NUMBERのネストされたテーブル)であるSYSTEM.NUMBER_TBL_TYPEに基づいてコレクションにデータを入力します。

    declare
        ids system.number_tbl_type;
        fh utl_file.file_handle;
        idx pls_integer := 0;
        n pls_integer;
     begin
        fh := utl_file.fopen('your_data_directory', 'your_data.csv', 'r');
        begin
            utl_file.get_line(fh, n);
            loop  
                idx := idx + 1;
                ids.extend();
                ids(idx) := n;
                utl_file.get_line(fh, n);
            end loop;
       exception
          when no_data_found then
              if utl_file.is_open(fh) then
                 utl_file.fclose(fh);
              end if;
         when others then
              raise;
      end;
      for id_recs in  in  ( select csv.column_value 
                  , case ( when tgt.id is null then 'invalid' else 'valid') end as valid_id
                    from (select * from table(ids)) csv
                left join target_table tgt on (csv.column_value = tgt.id)
      ) loop
      dbms_output.put_line '(ID '||id_recs.column_value || ' is '||id_recs.valid_id);
      end loop;
    end;
    

    注:私はこのコードをテストしていません。原則は健全ですが、詳細にはデバッグが必要な場合があります;)




    1. テーブルでVARCHAR(MAX)を使用することに不利な点はありますか?

    2. MySQLで大文字と小文字を区別しないREPLACE?

    3. 条件付きリード/ラグ関数PostgreSQL?

    4. GroupingError:ERROR:列はGROUP BY句に表示されるか、集計関数で使用される必要があります