他のフィールドに依存する自動インクリメント「カウンター」を取得する最良の方法は何ですか?.
このテーブルを想像してください
CUSTOMER - COUNTER
1 - 1
1 - 2
1 - 3
2 - 1
2 - 2
すべての顧客に追加するレコードごとに、カウンターのインクリメントが 1 必要です。
よろしく。
他のフィールドに依存する自動インクリメント「カウンター」を取得する最良の方法は何ですか?.
このテーブルを想像してください
CUSTOMER - COUNTER
1 - 1
1 - 2
1 - 3
2 - 1
2 - 2
すべての顧客に追加するレコードごとに、カウンターのインクリメントが 1 必要です。
よろしく。
すべての顧客のカウンターを保持する追加のテーブルを作成します。
CREATE TABLE customer_counter
(
customer_id INTEGER NOT NULL,
counter INTEGER NOT NULL,
PRIMARY KEY (customer_id)
)
特定の顧客の次のカウンター番号を取得するには、次の手順を使用します。
CREATE PROCEDURE get_customer_counter (customer_id INTEGER)
RETURNS (counter INTEGER)
AS
BEGIN
SELECT SUM(counter) FROM customer_counter
WHERE customer_id = :customer_id
INTO :counter;
counter = COALESCE(:counter, 0);
EXECUTE STATEMENT
'INSERT INTO customer_counter (customer_id, counter) ' ||
'VALUES (' || :customer_id || ', 1)'
WITH AUTONOMOUS TRANSACTION;
END
単一のレコードを更新する代わりに、合計を使用してデルタ値を挿入する方法を確認してください。したがって、デッドロックを防ぎます。
定期的に、デルタ レコードを合計値のあるレコードにマージして、カウンター テーブルをクリアする必要があります。
CREATE TRIGGER on_disconnect_database
ACTIVE
ON DISCONNECT
AS
DECLARE VARIABLE sm INTEGER;
DECLARE VARIABLE cnt INTEGER;
DECLARE VARIABLE customer_id INTEGER;
BEGIN
FOR
SELECT customer_id, SUM(counter), COUNT(counter)
FROM customer_counter
GROUP BY customer_id
INTO :customer_id, :sm, :cnt
DO BEGIN
IF (:cnt > 1) THEN
BEGIN
DELETE FROM customer_counter WHERE customer_id = :customer_id;
INSERT INTO customer_counter (customer_id, counter)
VALUES (:customer_id, :sm);
WHEN ANY DO
BEGIN
END
END
END
END
与えられたものについて正確に何を望んでいるのかを本当に伝えるのは難しいですが、各 X フィールドと Y サブフィールドをループしたり、カウンターなどに使用したりしたいと思います。
<?php
$x = array("customer1","customer2","customer3");
$y = array("name","address","phone");
$counter;
foreach($x as $eachX):
$counter = 1;
foreach($y as $eachY):
//do stuff here
$counter++;
endforeach;
endforeach;
?>
このストアド プロシージャは問題ないと思います。
create procedure New_Procedure
returns (
o_customer integer,
o_counter integer)
as
declare variable v_oldcostomer integer;
begin
for select customer
from customers
order by 1
into o_customer
do begin
if (v_oldcostomer is null or (v_oldcostomer is not null and v_oldcostomer <> o_customer) ) then
o_counter = 0;
o_counter = o_counter + 1;
v_oldcostomer = o_customer;
suspend;
end
end