将集合插入至外层的集合内

将 SET 插入至 LIST 内,类似于将单个值插入至简单的集合内。

要将 SET 插入至 LIST 内,请声明集合变量来保存该 LIST,并将整个集合选择至它内。当您使用集合变量作为集合派生的表时,该 LIST 中的每一 SET 成为该表的一行。然后,您可将另一 SET 插入在该 LIST 的末尾或插入在指定的点。

例如,一个数值行的 twin_primes 列可能包含下列 LIST,如下图所示。

图: 样例 LIST。

LIST( SET{3,5}, SET{5,7}, SET{11,13} )
如果您将 LIST 视为集合派生的表,则它看上去可能像这样。

图: 将 LIST 视为集合派生的表。

{3,5}
            {5,7}
            {11,13}
您可能想要插入值 "SET{17,19}" 作为 LIST 中的第二项。下图中的语句展示如何执行。

图: 将值插入到 LIST 中。

CREATE PROCEDURE add_set()
          
          DEFINE l_var LIST( SET( INTEGER NOT NULL ) NOT NULL );
          
          SELECT twin_primes INTO l_var FROM numbers
          WHERE id = 100;
          
          INSERT AT 2 INTO TABLE (l_var) VALUES( "SET{17,19}" );
          
          UPDATE numbers SET twin_primes = l
          WHERE id = 100;
          
          END PROCEDURE;
在 INSERT 语句中,VALUES 子句将值 SET {17,19} 插入在 LIST 的第二个位置。现在,该 LIST 看上去像下图这样。

图: LIST 项。

{3,5}
          {17,19}
          {5,7}
          {11,13}
通过将 SET 作为参数传到 SPL 例程,您可执行相同的插入,如下图所示。

图: 将 SET 作为参数传到 SPL 例程。

CREATE PROCEDURE add_set( set_var SET(INTEGER NOT NULL), 
            row_id INTEGER );
            
            DEFINE list_var LIST( SET(INTEGER NOT NULL) NOT NULL );
            DEFINE n SMALLINT;
            
            SELECT CARDINALITY(twin_primes) INTO n FROM numbers
            WHERE id = row_id;
            
            LET n = n + 1;
            
            SELECT twin_primes INTO list_var FROM numbers
            WHERE id = row_id;
            
            INSERT AT n INTO TABLE( list_var ) VALUES( set_var );
            
            UPDATE numbers SET twin_primes = list_var
            WHERE id = row_id;
            
            END PROCEDURE;

add_set() 中,用户提供 SET 来添加到 LIST,以及标识将 SET 插入其中的那行的 id 的 INTEGER 值。