被神通数据库 SQL语句使用

用户可以在客户端单独执行的SQL语句中调用PLOSCAR存储过程。 具体地说,PLOSCAR过程调用可以作为操作数出现在SQL语句的任何表达式中。 在这种调用方式中,PLOSCAR过程扮演的角色有以下几种。

作为结果集

这是过程调用最常见的形式,过程名出现在EXEC语句的target list中。

调用语法为:

exec_stmt ::=

当函数参数都是IN型时,函数返回值作为结果集返回。

示例1:作为结果集返回

--  清理环境
DROP PROCEDURE proc;
DROP TABLE tab CASCADE;

CREATE TABLE tab (a int);
create or replace procedure proc() as
begin
    insert into tab values (1);
    if FOUND then
        insert into tab values (2);
    end if;
    
    update tab set a = 100 where a = 1;
    if FOUND then
        insert into tab values (3);
    end if;
    
    delete from tab where a = 9999; -- matches no rows
    if not FOUND then
        insert into tab values (4);
    end if;
    
    for i in 1 .. 10 loop
    -- no need to do anything
        NULL;
    end loop;
    if FOUND then
        insert into tab values (5);
    end if;
    
    -- never executes the loop
    for i in 2 .. 1 loop
    -- no need to do anything
        NULL;
    end loop;

    if not FOUND then
        insert into tab values (6);
    end if;
end;
/
exec proc();


select * from tab;
A(int)      |
------------
100         |
------------
2           |
------------
3           |
------------
4           |
------------
5           |
------------
6           |
总数目:6

--删除过程
DROP PROCEDURE proc;
DROP TABLE tab CASCADE;

当存储过程参数中有OUT/INOUT型参数时,参数部分会作为结果集返回。 OUT/INOUT型参数的值依次作为结果集的第一、二、……列。

示例2:含有OUT/INOUT型参数的存储过程

--  清理环境
DROP PROCEDURE add_one;

create or replace procedure add_one(i inout int, j inout int) as
begin
i := i + 1;
j := j + 1;
end;

/
exec add_one(10,100);
I(int)      |J(int)      |
------------------------
11          |101         |
总数目:1

--删除过程
DROP PROCEDURE add_one;