LightDB支持存储过程,除了支持Postgres的plpgsql存储过程,还兼容Oracle的存储过程,新增了plorasql过程语言。上一篇中我们介绍了存储过程中的控制语句,这一篇主要讲述存储过程中的静态SQL语句。
什么是静态SQL语句呢?
PL/SQL中的静态SQL语句是指可以直接在PL/SQL中使用的SQL语句,其语法与标准的SQL语义完全一致。
由于PL/SQL程序执行时采用早期绑定,即在编译阶段对变量进行绑定,识别程序中标识符的位置,检查用户权限、数据库对象等信息,因此在PL/SQL中并不是所有语句就可以出现的,下列类型的SQL语句是可以出现的,因为它们不会修改数据库模式对象及其权限。
- 查询语句: SELECT
- DML语句: INSERT、UPATE、DELETE、MERGE (其中MERGE为lightdb22.1版本新增特性)
- 事务控制语句: COMMIT、ROLLBACK、BEGIN、SAVEPOINT
declare
vv mystudent%ROWTYPE;
begin
begin;
update mystudent set teachername = 'changan';
select * into vv from mystudent where rownum < 2;
commit;
end;
/
PL/SQL中的SELECT语句
为什么在这里单独把SELECT语句列出来了呢?因为与标准SELECT语句不同,在PL/SQL程序中,SELECT语句需要与INTO或BULK COLLECT INTO短语结合使用,将查询的结果保存到变量中。
- SELECT … INTO :单条记录查询
- SELECT … BULK COLLECT INTO : 多条记录查询
示例如下:
create procedure shenlan
as
declare
vid mystudent.id%TYPE;
v mystudent%ROWTYPE;
begin
select id into vid from mystudent where rownum < 2;
raise notice 'vid is %', vid;
select * into v from mystudent where rownum < 2;
raise notice '(%,%,%)', v.id,v.name,v.teachername;
end;
/
declare
type c_cursor is ref cursor;
type type_a is table of char(1) index by binary_integer;
c_test c_cursor;
v_a type_a;
begin
open c_test for select * from dual where false;
loop
fetch c_test bulk collect into v_a;
raise info 'v_a(1)=%',v_a(1);
exit when c_test%notfound;
end loop;
raise info 'v_a=%',v_a;
v_a.DELETE;
end;
PL/SQL中的DML语句
PL/SQL中的DML语句对标准SQL语句中的DML语句进行扩展,允许使用变量,语法与标准SQL完全相同。
declare
v constant int default 100;
begin
update myteacher set id = v where rownum < 2;
end;
/
更多请参考LightDB官网。
|