Stored procedures 相当于;“改变顺序”;在存储过程中可用的

Stored procedures 相当于;“改变顺序”;在存储过程中可用的,stored-procedures,ingres,Stored Procedures,Ingres,我需要在Ingres中生成一个存储过程,该过程能够获取一个ID列表,并生成一组与第一组ID无关的新ID(但存储每对ID的位置) 我最初的计划是按random()排序,并使用一个序列简单地从100000开始对每行进行编号,然后将这些结果保存到一个表中。这主要是有效的。但是,由于ALTER SEQUENCE不能在存储过程中使用,因此我无法确保新ID始终从100000开始 CREATE PROCEDURE create_external_dataset (datasetid varchar(12) N

我需要在Ingres中生成一个存储过程,该过程能够获取一个ID列表,并生成一组与第一组ID无关的新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中生成增量数字?

如果您使用的是Ingres 10.2,则有一个名为ROW_NUMBER()的函数,可以在本例中替换序列

行号() 返回分区内每个结果行的顺序位置,基于 由窗口的顺序定义定义的序列。与 排序规范中的相同值可以任意排序。 例如:1,2,3,4,5。 下面的查询为每一行分配一个连续的数字。吵架 匹配的数字可以任意排序

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

如果行数为常量且已知,则可以创建重复序列,从而无需重置序列(它确实需要为常量)


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

将您的alter序列包装在“”中,并使用
DECLARE@sql NVARCHAR(MAX)=N'alter sequence random_order_rank重新启动100000;'EXEC dbo.sp_executesql@sql
刚刚发现它是Ingres DB,在存储过程中找到类似于动态SQLTry的东西
声明@sql VARCHAR(1000)=“ALTER SEQUENCE random_order_rank RESTART WITH 100000;”;执行即时sql动态SQL在Ingres存储过程中也不可用。因此,我看不到任何其他方法可以很好地实现这一点。也许从与作业或外部脚本等效的存储过程开始可以作为变通方法。
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
CREATE SEQUENCE random_order_rank AS INTEGER START WITH 10000 INCREMENT BY 1 MINVALUE 10000 MAXVALUE 60000 CYCLE;