等同于可在存储过程中使用的 "ALTER SEQUENCE"
Equivalent to "ALTER SEQUENCE" that is usable in a Stored Procedure
我需要在 Ingres 中生成一个存储过程,该过程能够获取 ID 列表并生成一组与第一组无关的新 ID(但我们存储每一对的位置)。
我最初的计划是通过 random() 排序,并使用一个序列简单地从 100000 开始对每一行进行编号,然后将这些结果保存到 table 中。这 大部分 有效。但是,因为不能在存储过程中使用 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 中生成增量数字的方法?
如果您使用的是 ingres 10.2,则有一个名为 ROW_NUMBER() 的函数,在这种情况下可以用它代替序列。
ROW_NUMBER()
Returns the ordinal position of each result row within a partition, based on
the sequence defined by the ordering definition for the window. Rows with the
same values in their sort specification are ordered arbitrarily.
For example: 1, 2, 3, 4, 5.
The following query assigns a consecutive number to each row. Rows with
matching numbers are ordered arbitrarily.
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;
如果行不是常数,您可以将序列设置为在大于最大可能行的长度上重复,将其写入 table,然后执行更新,减去一个值以带来您的 ID 回到范围内。如果这样做,您还需要检测序列何时循环并独立处理大 ID 和小 ID。
我需要在 Ingres 中生成一个存储过程,该过程能够获取 ID 列表并生成一组与第一组无关的新 ID(但我们存储每一对的位置)。
我最初的计划是通过 random() 排序,并使用一个序列简单地从 100000 开始对每一行进行编号,然后将这些结果保存到 table 中。这 大部分 有效。但是,因为不能在存储过程中使用 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 中生成增量数字的方法?
如果您使用的是 ingres 10.2,则有一个名为 ROW_NUMBER() 的函数,在这种情况下可以用它代替序列。
ROW_NUMBER() Returns the ordinal position of each result row within a partition, based on the sequence defined by the ordering definition for the window. Rows with the same values in their sort specification are ordered arbitrarily. For example: 1, 2, 3, 4, 5. The following query assigns a consecutive number to each row. Rows with matching numbers are ordered arbitrarily.
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;
如果行不是常数,您可以将序列设置为在大于最大可能行的长度上重复,将其写入 table,然后执行更新,减去一个值以带来您的 ID 回到范围内。如果这样做,您还需要检测序列何时循环并独立处理大 ID 和小 ID。