0

人々がそこでスケジュールを計画するのに役立つアプリケーションを開発しています。

次のような列がある「Plan_Table」というテーブルがあるとしましょう

id,user_name, timestamp,place,event,plan_number.

毎日、活動に応じて多くのレコードを挿入できます。'plan_number' 列にトリガーによってデータが入力されるようにします。ユーザーが一度に (バッチで) 5 つのレコードを挿入するとします。plan_number フィールドを次のように挿入したい

plan_1
plan_1
plan_1
plan_1
plan_1

彼が別の計画を思いついた場合..挿入をほとんど行わない場合、今回は 3 としましょう... plan_number フィールドを次のように挿入します

plan_2
plan_2
plan_2

トリガーとシーケンスを使用してこれを達成する方法は?

前もって感謝します。

4

4 に答える 4

1

そのテーブルの before ステートメント レベル トリガーとグローバル パッケージ変数を組み合わせて使用​​し、そのテーブルの行レベル トリガーで使用できると思います。上記のロジックを理解していただけると幸いです

于 2013-06-19T11:30:05.903 に答える
1
var_plan_number number := 0;
begin 
if :new.plan_number is null then
 select max(plan_number) into var_plan_number from plan_table where timestamp < CURRENT_TIMESTAMP - 5 --*some_treshold - ie 5 seconds* 
 and timestamp > CURRENT_TIMESTAMP and timestamp > trunc(sysdate) and user_name = :new.user_name;
 --idea is to select max plan_number for current day and increment it by 1
 --treshold should be set to time, your script is able to process batch records

 var_plan_number := var_plan_number + 1;    
 :new.plan_number := var_plan_number;
end if;

それはトリックを行う必要があります...

これは、トリガーがどのように見えるべきかという疑似コードと考えてください。シーケンスは必要ありません。

于 2013-06-19T11:56:14.313 に答える
1

問題は、「一度に(バッチで)」の定義にあります。1 つのバッチがいつ終了し、新しいバッチがいつ開始されるかをトリガーに伝えるのは困難です。パッケージ変数で可能ですが、最も適切な場所はアプリケーションです。

ID を生成するシーケンスを作成しますが、アプリケーションで ID を取得し、INSERT ステートメントに直接フィードします。

CREATE SEQUENCE myids;
CREATE TABLE plan_table(id int, user_name varchar2(30), mytimestamp, ...); 

そしてあなたのコードで:

SELECT myids.nextval INTO myplanid FROM DUAL;
INSERT INTO plan_table(myplanid, myuser_name, SYSTIMESTAMP, place1 ...);
INSERT INTO plan_table(myplanid, myuser_name, SYSTIMESTAMP, place2 ...);
INSERT INTO plan_table(myplanid, myuser_name, SYSTIMESTAMP, place3 ...); 
COMMIT;
于 2013-06-19T11:56:52.693 に答える