#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
pdf-btn 下载文档
copy-btn 复制链接