#DML Statement
DML Statement为静态SQL执行语句。其语法形式与常规DML类的SQL语句一致,且可以结合INTO语法为变量赋值。
在过程体中,DML语句可直接执行,或通过EXECUTE Statement调用执行,此时同样可以结合INTO语法为变量赋值。
# 常规用法
不与INTO结合时,静态SQL不能为SELECT语句。
示例
CREATE OR REPLACE PROCEDURE ya_proc IS
no VARCHAR(10);
name VARCHAR(20);
BEGIN
UPDATE area SET area_no='00' WHERE area_no='03';
DELETE FROM area WHERE area_no='03';
INSERT INTO area
SELECT area_no+20, area_name, dhq
FROM area
WHERE area_no IN ('01','02','03');
COMMIT;
END;
/
exec ya_proc;
# select...into
本语句可以将SELECT语句从数据库中查询到结果赋值给变量,但查询的结果只能是一行记录,不能是零行或多行记录。
对于不能确保获得一行结果集的SELECT语句,需通过游标实现结果集赋值。
执行SELECT INTO语句时,若发生TOO MANY ROWS异常,在抛出异常前已经将第一行记录赋值给变量。
示例
CREATE OR REPLACE PROCEDURE ya_proc IS
no VARCHAR(10);
name VARCHAR(20);
BEGIN
SELECT area_no,area_name INTO no,name FROM area WHERE area_no='01';
DBMS_OUTPUT.PUT_LINE('区域号码:'||no||'区域名称:'||name);
--下面语句将抛出NO_DATA_FOUND异常,通过EXCEPTION Statement将其捕获
SELECT area_no,area_name INTO no,name FROM area WHERE area_no='09';
DBMS_OUTPUT.PUT_LINE('区域号码:'||no||'区域名称:'||name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('warning:no data found!');
END;
/
exec ya_proc;
--result
区域号码:01区域名称:华东
warning:no data found!
# select...bulk collect into
本语句可以将SELECT语句从数据库中查询的结果赋值给集合变量,查询的结果可以是零行或任意数量行。
对使用字符串类型作键的关联数组,不允许使用BULK COLLECT子句。
BULK COLLECT INTO的目标对象必须是集合类型。
示例
DECLARE
TYPE area_tb IS TABLE OF area%rowtype;
type_001 area_tb;
BEGIN
SELECT * BULK COLLECT INTO type_001 FROM area ORDER BY 1,2;
FOR i IN type_001.first..type_001.last LOOP
DBMS_OUTPUT.PUT_LINE('type_001('||i||'): ' || type_001(i).area_no || CHR(9) || type_001(i).area_name );
END LOOP;
END;
/
--result
type_001(1): 01 华东
type_001(2): 02 华西
type_001(3): 03 华南
type_001(4): 04 华北
type_001(5): 05 华中
# insert into...return...into
本语句在执行INSERT操作的同时,指定一个返回的结果集,并将其赋值给变量。其中RETURN也可以写为RETURNING。
结果集可以包含一列或多列数据,每一列为一个YashanDB通用表达式,但不能为伪列、聚集函数和窗口函数。
在此种用法中,INSERT语句只能为insert_values_clause语法,不可以为多行或者子查询插入。
列存表无法使用insert into...return...into语句。
变量名不可与表中列名相同。
示例(HEAP表)
CREATE OR REPLACE PROCEDURE ya_proc IS
no INT;
v_area_name VARCHAR(20);
BEGIN
INSERT INTO area(area_no) VALUES('09')
RETURN TO_NUMBER(area_no), NVL(area_name, 'area'||area_no) INTO no, v_area_name;
DBMS_OUTPUT.PUT_LINE('区域号码:'||no||'区域名称:'||v_area_name);
END;
/
exec ya_proc;
--result
区域号码:9区域名称:area09