Stored procedures 依赖于其他字段的自动增量

Stored procedures 依赖于其他字段的自动增量,stored-procedures,firebird,Stored Procedures,Firebird,获取依赖于其他字段的自动递增“计数器”的最佳方法是什么 想象一下这张桌子 CUSTOMER - COUNTER 1 - 1 1 - 2 1 - 3 2 - 1 2 - 2 我需要计数器为每个客户添加的每个记录递增1 注意。很难真正说出您对所给内容的确切要求,但我假设您希望循环遍历每个X字段及其Y子字段,将其用作计数器或其他任何东西 <?php $x = array("customer1","customer2","customer3"); $y = array("name","addre

获取依赖于其他字段的自动递增“计数器”的最佳方法是什么

想象一下这张桌子

CUSTOMER - COUNTER
1 - 1
1 - 2
1 - 3
2 - 1
2 - 2
我需要计数器为每个客户添加的每个记录递增1


注意。

很难真正说出您对所给内容的确切要求,但我假设您希望循环遍历每个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
create procedure New\u procedure
返回(
o_客户整数,
o_计数器(整数)
作为
声明变量v_oldcostomer integer;
开始
针对选定客户
来自客户
按1订购
进入o_客户
一定要开始
如果(v_oldcostomer为null或(v_oldcostomer不为null且v_oldcostomer o_customer))则
o_计数器=0;
o_计数器=o_计数器+1;
v_旧客户=o_客户;
暂停;
结束
结束

为每位客户创建额外的表以容纳计数器:

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 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

对不起,我想我解释得不对,但你的回答会帮助我做另一件事。这个想法是,如果我在表中添加一条新记录,对于客户1,计数器值必须是4,但是如果是客户2,计数器值必须是3。例如,我们的想法是将订单字段分配给账单详细信息的记录。票据的所有详细信息都在一个表中,每个ID票据组的计数器值必须是自动递增的。我希望我现在解释得更好。谢谢