INSERT
功能描述
INSERT语句用于向表中添加一行或多行数据。
Vastbase在SQL Server兼容模式下,支持使用 insert into tablename exec proc
语法,将存储过程输出的结果集插入到表中。
本文档只介绍INSERT语句兼容SQL Server的特性,原Vastbase的INSERT语法未做删除和修改,详见INSERT。
注意事项
该功能仅在数据库兼容模式为SQL Server时支持(即数据库实例初始化时指定DBCOMPATIBILITY='MSSQL')。
INSERT语句的待插入数据若为EXEC语句的返回结果集,则应该注意如下:
insert into tablename exec proc
语法功能在使用前必须通过set behavior_compat_options='block_return_multi_result';
语句开启使用存储过程或者匿名块支持返回一个或者多个结果集的功能。开启后,存储过程或者匿名块中的一个或者多个查询语句结果,会随着查询语句的执行输出到客户端,且每条查询结果是相互独立的,否则语法结构不兼容,会返回报错信息。insert into tablename exec proc
语法功能在使用时不可省略into。支持插入指定列,但结果集必须与指定列数据兼容。
EXEC语句返回一个结果集时,结果集column_list必须与待插入数据的表列兼容。
待插入数据的表必须为实际创建的物理表,不能是表值函数(即TABLE类型)。
INSERT的数据集应为procedure中执行select的结果集,OUTPUT将参数定义为出参,不可为function,否则报错。
语法格式
[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT [/*+ plan_hint */] [IGNORE] [INTO] table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ]
{ DEFAULT VALUES
| [ VALUES | VALUE ] [{( { expression | DEFAULT } [, ...] ) }][, ...]
| query
| set_clause_values }
[ ON DUPLICATE KEY UPDATE { NOTHING | { column_name = { expression | DEFAULT } } [, ...] [ WHERE condition ] }]
[ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ]
[EXEC proc_name];
本文档仅列出部分语法,更多INSERT语法和参数说明请参考INSERT。
参数说明
EXEC
标识符,标志插入数据来源于存储过程的结果集。
proc_name
存储过程名称,应为已存在的procedure。存储过程中执行select操作产生的结果集即为insert插入的数据集。
示例
示例1: 通过存储过程将返回日期数据插入表中。
1、开启使用存储过程或者匿名块支持返回一个或者多个结果集的功能。
set behavior_compat_options='block_return_multi_results';
2、打开serveroutput参数。(使信息从存储过程传输回应用程序,输出在屏幕上。)
set serveroutput on;
3、创建测试表和存储过程,存储过程中调用了DATEADD函数,用于在日期中添加或减去指定的时间间隔。
create table table_1189228(col1 date);
create or replace procedure pro_1189228(a date,b inout date) as
begin
select DATEADD(day, 7, a);
b=a;
select DATEADD(month, -1, b);
end;
/
4、调用存储过程,将存储过程pro_1189228的计算结果插入测试表中。
declare b date;
begin
insert into table_1189228 exec pro_1189228('2024-01-16',b);
select * from table_1189228;
select b;
end;
/
回显结果为如下:
col1
------------
2024-01-23
2023-12-16
(2 rows)
b
------------
2024-01-16
(1 row)
5、查看测试表中数据。
select * from table_1189228;
返回结果为如下,表示插入存储过程结果集至测试表成功。
col1
------------
2024-01-23
2023-12-16
(2 rows)
示例2: 向带有唯一约束的表中插入存储过程的结果集。
1、开启使用存储过程或者匿名块支持返回一个或者多个结果集的功能。
set behavior_compat_options='block_return_multi_results';
2、打开serveroutput参数。(使信息从存储过程传输回应用程序,输出在屏幕上。)
set serveroutput on;
3、创建测试表,为col1列添加唯一约束。
CREATE TABLE table_1189406
(
col1 INT,
col2 VARCHAR(50),
col3 VARCHAR(50),
col4 INT,
constraint con_1189406 unique(col1)
);
4、创建存储过程,定义了计算公式。
create or replace procedure pro_1189406_1(a int, b inout int) as
declare b int;
begin
select a + 1;
b=a*5;
end;
/
5、调用存储过程。
declare b int;
begin
insert into table_1189406 exec pro_1189406_1(2,b);
insert into table_1189406(col2) exec pro_1189406_1(2,b);
select * from table_1189406;
end;
/
回显结果为如下:
col1 | col2 | col3 | col4
------+------+------+------
3 | | |
| 3 | |
(2 rows)
ANONYMOUS BLOCK EXECUTE
6、再次调用存储过程,仅当数据不重复时可以插入。
declare b int;
begin
insert into table_1189406 exec pro_1189406_1(3,b);
insert into table_1189406(col2) exec pro_1189406_1(4,b);
select * from table_1189406;
end;
/
回显结果为如下:
col1 | col2 | col3 | col4
------+------+------+------
3 | | |
| 3 | |
4 | | |
| 5 | |
(4 rows)
7、查询测试表数据。
select * from table_1189406;
返回结果为如下:
col1 | col2 | col3 | col4
------+------+------+------
3 | | |
| 3 | |
4 | | |
| 5 | |
(4 rows)