0

我需要在 Ingres 中生成一个存储过程,该过程能够获取一个 ID 列表并生成一组与第一组无关的新 ID(但我们存储每一对的位置)。

我最初的计划是按 random() 排序,并使用一个序列简单地从 100000 开始对每一行进行编号,然后将这些结果保存到一个表中。这主要是有效的。但是,因为不能在存储过程中使用 ALTER SEQUENCE,所以我无法确保新的 id 总是从 100000 开始。

CREATE PROCEDURE create_external_dataset (datasetid varchar(12) NOT NULL) AS
BEGIN
    INSERT INTO external_sids
    SELECT :datasetid, NEXT VALUE FOR random_order_rank, sid
    FROM id_table
    ORDER BY random()
    FETCH FIRST 300000 ROWS ONLY;
END;
ALTER SEQUENCE random_order_rank RESTART WITH 100000;
EXECUTE PROCEDURE create_external_dataset('LTF-5463');

有没有办法从存储过程中重置序列或创建仅存储过程的序列实例?

如果做不到这一点,有没有办法在不使用序列的 Ingres 中产生增量数字?

4

1 回答 1

0

如果您使用的是 ingres 10.2,则有一个名为 ROW_NUMBER() 的函数,在这种情况下可以替换为序列。

ROW_NUMBER() 根据窗口的排序定义定义的顺序,返回分区内每个结果行的序号位置。在其排序规范中具有相同值的行是任意排序的。例如:1、2、3、4、5。以下查询为每一行分配一个连续的数字。具有匹配数字的行是任意排序的。

SELECT empno, deptno, sal, 
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal) AS rownum 
FROM emp; 
EMPNO DEPTNO SAL ROWNUM 
---------- ---------- ---------- ---------- 
934 100 1200 1 
782 100 2350 2 
839 100 4900 3 
369 200 700 1 
876 200 1000 2 
566 200 2875 3 
788 200 2900 4 
902 200 2900 5 
900 300 850 1 
654 300 1150 2 
521 300 1150 3 
844 300 1400 4 
499 300 1500 5 
698 300 2750 6

在早期版本的 Ingres 中,没有针对此问题的直接解决方案。要考虑的选项是:

如果行数是恒定且已知的,您可以创建一个重复序列,无需重新设置序列(它确实需要是恒定的)。

CREATE SEQUENCE random_order_rank AS INTEGER START WITH 10000 INCREMENT BY 1 MINVALUE 10000 MAXVALUE 60000 CYCLE;

如果行不是恒定的,您可以将序列设置为在大于最大可能行的长度上重复,将其写入表,然后执行更新,减去一个值以使您的 id 回到范围内。如果这样做,您还需要检测序列何时循环并独立处理大小 ID。

于 2015-09-09T16:39:48.947 回答