4

ETL を実行している Progress データベースがあります。読み取り元のテーブルの 1 つに一意のキーがないため、行を一意に識別できるように ROWID にアクセスする必要があります。進行中の ROWID にアクセスするための構文は何ですか?

行の識別に ROWID を使用すると問題があることは理解していますが、今のところこれだけです。

4

4 に答える 4

8

私の答えに対する簡単な警告 - 私がProgressで働いてからほぼ 10 年になるので、私の知識はおそらく少し古くなっています。

Progress Language Reference [PDF] を確認すると、私が覚えている 2 つの関数がまだ存在しているようです:ROWIDRECID. 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 のフィードバックに従って編集されました。

于 2008-09-19T08:12:16.943 に答える
5

状況とアプリケーションの動作に応じて、これは問題になる場合と問題にならない場合がありますが、ROWID と RECID は再利用され、変更される可能性があることに注意してください。

1) レコードが削除された場合、その ROWID は最終的に再利用されます。

2) テーブルがダンプ & ロードまたは tablemove によって新しいストレージ領域に再編成されると、ROWID が変更されます。

于 2009-06-22T12:13:00.210 に答える
3

Dave Webbの回答に少し追加するだけです。select ステートメントで ROWID を試しましたが、構文エラーが発生しました。ROWID は、選択する残りの列を指定した場合にのみ機能します。* は使用できません。

これは動作しません:

SELECT ROWID, * FROM customer WHERE cust-num = 123

これは機能します:

SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
于 2008-09-19T15:31:28.920 に答える
-2

Google で簡単に検索すると、http: //bytes.com/forum/thread174440.htmlが見つかります。

greg@turnstep.com のメッセージを最後まで読んでください (再永続性と一意性が必要な保証に応じて、oid または ctid が必要です)。

于 2008-09-18T22:16:23.787 に答える