#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语句,需通过游标实现结果集赋值。
示例
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!
# insert into...return...into
本语句在执行INSERT操作的同时,指定一个返回的结果集,并将其赋值给变量。其中RETURN也可以写为RETURNING。
结果集可以包含一列或多列数据,每一列为一个YashanDB通用表达式,但不能为伪列、聚集函数和窗口函数。
在此种用法中,INSERT语句只能为insert_values_clause语法,不可以为多行或者子查询插入。
示例
CREATE OR REPLACE PROCEDURE ya_proc IS
no INT;
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, area_name;
DBMS_OUTPUT.PUT_LINE('区域号码:'||no||'区域名称:'||area_name);
END;
/
exec ya_proc;
--result
区域号码:9区域名称:area09