您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

表变量上的 SQL DML 语句

您可以使用 SQL DML 语句修改 SQLScript 表变量中的数据。支持以下语句:

  • 插入

  • 更新

  • 删除

    语句的语法与操作持久表的语法相同。唯一的区别在于需要使用冒号来标记变量。

    DECLARE lt TABLE (a INT, b VARCHAR(20));
    

    INSERT INTO :lt VALUES (1, 'abc');

    UPDATE :lt SET b = 'def' WHERE a = 1;

    DELETE FROM :lt WHERE a = 1;

    约束

    表变量的 DML 语句支持以下约束检查:

  • 主键

  • 非空

    这些约束可以在用户定义的表类型和声明中定义,类似于持久表定义。

    CREATE TYPE tt AS TABLE (a INT PRIMARY KEY, b INT NOT NULL);
    

    DECLARE lt1 tt; -- the variable has constraints defined by the table type

    DECLARE lt2 TABLE (a INT, b INT, c INT NOT NULL, PRIMARY KEY(a, b));

    与其它语句的兼容性

    出于实施原因,无法将 DML 语句与同一表变量的其他表变量相关语句相结合。如果表变量由 DML 语句操作,则只能在包括查询和子调用的 SQL 语句中使用(如果变量绑定到输入参数)。变量不能是任何 assign 语句的目标,因此无法绑定到子调用的输出参数。

    DECLARE lt1 TABLE(a int);
    

    DECLARE lt2 TABLE LIKE :lt1;

    INSERT INTO :lt1 VALUES(1);

    INSERT INTO :lt2 (SELECT * FROM :lt1); -- supported

    SELECT * FROM :lt2; -- supported

    CALL nested_proc(:lt2); -- supported only if the procedure parameter is IN

    :lt1.INSERT(:lt2); -- not supported (INSERT operator)

    lt2 = SELECT * FROM :lt1; -- not supported (assignment target)

    转换

    如果需要针对一个数据集将 DML 语句与其他类型的语句相结合,则需要使用多个表变量。可以在 DML 语句中使用的变量与两个方向的 DML 语句中未使用的变量之间转换数据。

    以下示例演示了双向转换:

    DECLARE tab_without_dml TABLE (a INT);
    

    DECLARE tab_with_dml TABLE LIKE :lt1;

    --

    tab_without_dml = SELECT * FROM mytab;

    --

    -- execute non-DML statements with tab_without_dml ...

    --

    INSERT INTO :tab_with_dml (SELECT * FROM :tab_without_dml); -- convert variable without DML to variable with DML

    --

    -- execute DML statements with tab_with_dml ...

    --

    tab_without_dml = SELECT * FROM :tab_with_dml; -- convert variable with DML to variable without DML

    备注这两个变量的声明方式相同,即在声明时 DML 语句中使用的变量与 DML 语句中未使用的变量之间没有区别。在两个方向上,转换都表示数据复制。

    用例

    如果您的场景主要依赖于 SQL 语句,尤其是当您需要使用复杂的 SQL 逻辑来处理数据时,您可以使用 DML 语句,例如:

  • UPDATEDELETE 的复杂 WHERE 条件

  • 复杂的 UPDATE 语句

  • 约束检查

    在其他情况下,建议使用 SQLScript 表变量运算符操作表变量数据,因为它们提供了更好的性能,可以与其他表变量相关语句结合使用,并且不表示有关过程或函数参数处理的任何限制。

    备注也可以使用排序的表变量完成主键检查。

    限制

    表变量上的 DML 语句不能用于自主事务和并行执行块。

    使用 DML 语句既不能处理输入,也不能处理输出过程或函数参数。