Progress データベースから ROWID を取得する方法
-
01-07-2019 - |
質問
ETL を実行する Progress データベースがあります。読み取り中のテーブルの 1 つに一意のキーがないため、行を一意に識別できるように ROWID にアクセスする必要があります。進行中の ROWID にアクセスするための構文は何ですか?
行の識別に ROWID を使用すると問題があることは理解していますが、今のところそれしかありません。
解決
私の答えに対する簡単な注意点 - 私が一緒に働いてからほぼ 10 年になります。 進捗 したがって、私の知識はおそらく少なからず古いものです。
を確認する プログレス言語リファレンス [PDF] には、私が覚えている 2 つの関数がまだ存在していることが示されているようです。 ROWID
そして RECID
. 。の ROWID
機能は新しいので推奨されます。
Progress 4GL では、次のように使用します。
FIND customer WHERE cust-num = 123.
crowid = ROWID(customer).
または:
FIND customer WHERE ROWID(customer) = crowid EXCLUSIVE-LOCK.
を確認する 進行状況 SQL リファレンス [PDF] を表示 ROWID
SQL でも Progress 拡張機能として利用できます。次のように使用します。
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 が必要になります)