ETL を実行している Progress データベースがあります。読み取り元のテーブルの 1 つに一意のキーがないため、行を一意に識別できるように ROWID にアクセスする必要があります。進行中の ROWID にアクセスするための構文は何ですか?
行の識別に ROWID を使用すると問題があることは理解していますが、今のところこれだけです。
ETL を実行している Progress データベースがあります。読み取り元のテーブルの 1 つに一意のキーがないため、行を一意に識別できるように ROWID にアクセスする必要があります。進行中の ROWID にアクセスするための構文は何ですか?
行の識別に ROWID を使用すると問題があることは理解していますが、今のところこれだけです。
私の答えに対する簡単な警告 - 私がProgressで働いてからほぼ 10 年になるので、私の知識はおそらく少し古くなっています。
Progress Language Reference [PDF] を確認すると、私が覚えている 2 つの関数がまだ存在しているようです:ROWID
とRECID
. ROWID
関数はより新しく、優先されます。
Progress 4GL では、次のように使用します。
FIND customer WHERE cust-num = 123.
crowid = ROWID(customer).
また:
FIND customer WHERE ROWID(customer) = crowid EXCLUSIVE-LOCK.
Checking the Progress SQL Reference [PDF] showROWID
は、Progress 拡張機能として SQL でも利用できます。次のように使用します。
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
編集: Stefan のフィードバックに従って編集されました。
状況とアプリケーションの動作に応じて、これは問題になる場合と問題にならない場合がありますが、ROWID と RECID は再利用され、変更される可能性があることに注意してください。
1) レコードが削除された場合、その ROWID は最終的に再利用されます。
2) テーブルがダンプ & ロードまたは tablemove によって新しいストレージ領域に再編成されると、ROWID が変更されます。
Dave Webbの回答に少し追加するだけです。select ステートメントで ROWID を試しましたが、構文エラーが発生しました。ROWID は、選択する残りの列を指定した場合にのみ機能します。* は使用できません。
これは動作しません:
SELECT ROWID, * FROM customer WHERE cust-num = 123
これは機能します:
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
Google で簡単に検索すると、http: //bytes.com/forum/thread174440.htmlが見つかります。
greg@turnstep.com のメッセージを最後まで読んでください (再永続性と一意性が必要な保証に応じて、oid または ctid が必要です)。