質問

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 が必要になります)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top