1

私は以下のような従業員、製品、製品走行距離計の表を持っています

ここに画像の説明を入力してください

各従業員は、アクセスできる製品に応じて一意のemp_codeを持っています。

各製品には、その識別子に一意のプレフィックスが付いています。

製品ごとに一意の英数字の識別子を生成し、それを従業員に割り当てる必要があります。

この製品IDは、プレフィックスを含めて9文字の長さになります。

走行距離計テーブルには、その特定の製品の従業員に割り当てられた最後のemp_codeが格納されます。

システムに追加される新しい従業員ごとに、製品に基づいてこれらの英数字のemp_codeを生成するストアドプロシージャを作成するにはどうすればよいですか?

助けてください。

編集1:

走行距離計の表を少し修正するだけで、走行距離計をA00000001として保存する必要がない場合があります。代わりに、00000001を保存してから、プレフィックスを追加することしかできませんでした。

編集2:

これは私がこれまでに行ったことです。

create or replace PROCEDURE SP_GEN_NEXT_DUMMY_DB_PRISM_ID
(
  in_product_id number,
  db_prism_id out varchar2
)
AS
BEGIN

  UPDATE BI_DB_PRISM_ID_ODOMETER
  SET DB_PRISM_ID =  DB_PRISM_ID + 1
  WHERE 
    PRODUCT_ID = in_product_id; 

  SELECT to_char(db_prism_id, 'FM00000000') into db_prism_id FROM     BI_DB_PRISM_ID_ODOMETER WHERE PRODUCT_ID = in_product_id; 

END;

しかし、トランザクションで実行されることを確認するにはどうすればよいですか。また、生成された番号に製品プレフィックスを追加するにはどうすればよいですか。

4

3 に答える 3

3

私が考えることができる2つのオプションがあります:

  1. 製品ごとにOracleシーケンスを作成します。おそらく、新製品を検出してシーケンスを動的に作成する何らかのメンテナンス手順を使用します。

  2. 独自のシーケンスコードをロールします。最後の値をProductテーブルに格納します。特定の製品の新しい値を生成するプロシージャを記述します。この手順では、最初に製品テーブルの行ロックを取得し(2つのセッションが同時に同じ値を取得しないようにするため)、値を進めて、新しい値を製品テーブルに書き込みます。この手順は自律型トランザクションである必要があります(そうでない場合、他のセッションは、セッションがすぐにコミットまたはロールバックしない場合に待機します)。

#1の利点は、最速であることです。

#1の欠点は、動的DDLを実行する必要があることです。また、走行距離計レコードを挿入する前に、製品のDDLが実行されていることを確認する必要があります。製品が削除された場合にシーケンスを削除するかどうかについても考慮する必要がある場合があります。

#1のもう1つの欠点は、動的SQLでのみシーケンス値を取得できることです(実行時にシーケンスの名前を決定する必要があります)。

#2の欠点は、同時DMLを許可するシステムでは誤解しやすいことです。ロジックが正しいことを確認し、高い同時負荷の下でテストする必要があります。また、#2は各製品のアクセスをシリアル化するため、#1よりもパフォーマンスが低下します。

編集

「しかし、トランザクションで実行されることを確認するにはどうすればよいですか。また、生成された番号に製品プレフィックスを追加するにはどうすればよいですか。」

Oracleではトランザクションは自動です。ただし、この場合、必要なのは自律トランザクションです。

製品プレフィックスの追加は、文字列連結関数を使用して行われます-例:||

于 2012-05-18T06:40:32.690 に答える
1

ここでデータモデルを非正規化しているようです。

走行距離計テーブルは製品テーブルと1:1であり、走行距離計の値は、その製品に現在割り当てられている従業員の数にも依存します。

emp_codeシーケンス番号は、従業員IDと製品テーブルから取得できます。おそらく、識別子のプレフィックスは製品IDからも推測できるため、実際には、スキーマに冗長な列と冗長なテーブルがあります。

本当に必要ですか?

于 2012-05-18T08:00:36.333 に答える
0

おそらく私はここで何かが欠けているので、もしそうなら私の謝罪を受け入れてください。

走行距離計は、各製品にアクセスできる従業員の数の単なるカウンターであるように思われます。

その場合は、テーブル(およびEMP_CODE列)を完全に削除して、1つ以上のビューでその情報を「構築」してみませんか?

アレッサンドロ

PS:DavidAldridgeの同じ提案を投稿したようです。混乱させて申し訳ありません。

于 2012-05-18T08:03:01.403 に答える