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

SQL呼び出し一時テーブルからの最大行番号

    TEMP_TABLEには、挿入順序を示す順次主キーまたはその他のインジケーターがありません。そのため、テーブル自体の列を使用してLOADの最新のIDを取得することはできません。

    ただし、オプションが1つあります。 ORA_ROWSCN() 。これは、トランザクションのシステム変更番号を識別する疑似列です。 テーブルを変更しました。したがって、ORA_ROWSCNでテーブルを並べ替えることで、挿入の順序を再構築できます。

    注意点がいくつかあります:

    1. デフォルトでは、SCNはブロックレベルに適用されます。したがって、ブロック内のすべての行は同じSCNを持ちます。幅の広いテーブルには十分な近似値ですが、TEMP_TABLEのような2列のおもちゃには絶望的です。 SCNは行レベルで追跡できますが、テーブルがROWDEPENDENCIESで作成されている場合に限ります。デフォルトはNOROWDEPENDENCIESです。残念ながら、ここではALTERTABLEを使用できません。テーブルを削除して再作成する必要があります(*) ROWDEPENDENCIESを有効にします。
    2. SCNはトランザクションに適用されます。これは、TEMP_TABLEの各行が個別のトランザクションに挿入された場合にのみソリューションが機能することを意味します。
    3. 明らかに、これはTEMP_TABLEが実際のテーブルであり、ビューやその他の構成ではない場合にのみ可能です。

    これらすべての基準が満たされている場合、ここに必要な結果セットを提供するクエリがあります。

    select load, id
    from ( select load
                  , id
                  , row_number() over (partition by load order by ora_rowscn desc) as rn
           from temp_table
    )
    where rn = 1
    

    db <>fiddle のデモがあります 。また、NOROWDEPENDENCIESで定義されたTEMP_TABLEを除いて、同じデモで間違った結果が生成されます

    (*) データをTEMP_TABLEに保持する必要がある場合の手順は、次のとおりです。

    1. rename TEMP_TABLE to whatever;
    2. create table TEMP_TABLE as select * from whatever rowdependencies;
    3. drop table whatever;

    ただし、SCNは既存の行で同じになります。それが重要な場合は、保存したい順序で各行を一度に1つずつ挿入し、挿入するたびにコミットする必要があります。




    1. mysqlプロシージャの名前を変更します

    2. JDBCを使用してXAMPPMySQLローカルDBに接続するにはどうすればよいですか?

    3. ストアドプロシージャにテーブル名を渡すにはどうすればよいですか?

    4. 配列データ型、分割文字列、