EXEC

说明

执行单独的过程或函数,也可以执行在包中定义的过程或函数

语法

exec ::=

参数

EXEC | CALL

这两个关键字都支持且作用相同,但必须选其一。

IN OUT

在 EXEC/CALL 和 proc_name 之间指定可指定 IN 或 OUT

  • 指定IN,表示要执行的是过程。如果未找到匹配的过程,将报错。
  • 指定OUT,表示要执行的是函数。如果未找到匹配的函数,将报错。

缺省则为 IN

proc_name

要执行的存储过程或函数名

IN OUT INOUT

在参数前可指定IN/OUT/INOUT,也可不指定

  • 指定IN,表示参数不需要接收返回值。(在过程/函数声明时,该参数可以是IN/OUT/INOUT类型)
  • 指定OUT,表示参数需要接收返回值。(在过程/函数声明时,该参数可以是OUT/INOUT类型)
  • 指定INOUT,表示参数需要接收返回值。(在过程/函数声明时,该参数必须是INOUT类型)

不指定,表示参数按声明时的类型,决定是否需要接收返回值

expr

表达式,参数的值。按照参数的顺序进行赋值

arg_name = expr

按参数名对参数进行赋值

注解

参数名和默认值的使用

可以为存储过程的参数声明参数名和默认值。在调用的时候对一个存储过程的参数赋值有两种方法:按序赋值和按参数名赋值。

按序赋值是指在调用存储过程的时候,实参按照顺序对形参逐一赋值。

用参数名赋值则是用 argname = value_expr的方式来对形参进行赋值。

如果不使用参数名,那么将会使用按序赋值,在实参的数量不够的时候,未被赋值的会自动使用默认值(如果有默认值),或者报错(没有默认值)。

使用参数名可以不按照顺序来对存储过程的参数进行赋值。没有被赋值的参数都会使用默认值(如果有的话),或者报错(没有默认值)。

按序赋值可以跟按参数名赋值混合使用,但在混合使用的时候,按参数名赋值必须出现在按序赋值之后。

示例

示例1: 创建存储过程

--  清理环境
DROP PROCEDURE proc1;
DROP PROCEDURE proc0;
DROP TABLE tab1 CASCADE;

--  创建表
CREATE TABLE tab1 (a INT);


SELECT * FROM tab1 ORDER BY a;
A(int)      |
总数目:0


--  创建存储过程(无参数)
CREATE PROCEDURE proc0 AS
BEGIN
   EXECUTE IMMEDIATE 'INSERT INTO tab1 VALUES (100)';
END;
LANGUAGE 'plOSCAR';



--  执行存储过程(无参数)
EXEC proc0();


--  存储过程已向表中插入数据 100
SELECT * FROM tab1 ORDER BY a;
A(int)      |
------------
100         |
总数目:1


--  创建存储过程(有参数)
CREATE PROCEDURE proc1 (INT, INT) AS
BEGIN
   EXECUTE IMMEDIATE 'INSERT INTO tab1 VALUES (' || ($1 + $2) || ')';
END;
LANGUAGE 'plOSCAR';


--  执行存储过程(有参数)
EXEC proc1(80, 120);


--  存储过程已向表中插入数据 200
SELECT * FROM tab1 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
总数目:2


--  删除存储过程和表
DROP PROCEDURE proc1;
DROP PROCEDURE proc0;
DROP TABLE tab1;

示例2: 使用 IN | OUT | INOUT 属性

--  清理环境
DROP PROCEDURE proc2;


--  创建存储过程
CREATE PROCEDURE proc2(a INT, b OUT INT) AS
BEGIN
   IF A = 0 THEN B := -1;
   ELSE B := A;
   END IF;
END;
LANGUAGE 'plOSCAR';



--  执行存储过程
EXEC proc2(101, NULL);
B(int)      |
------------
101         |
总数目:1


--  参数不符,执行失败
EXEC proc2(OUT 101, NULL);
2019-09-03 13:11:25, ERROR, Analyze, The 1st argument of the procedure PROC2 has not been decalred as out



--  删除存储过程
DROP PROCEDURE proc2;

示例3: 使用参数默认值

--  清理环境
DROP PROCEDURE proc3;
DROP TABLE tab3 CASCADE;

--  创建表
CREATE TABLE tab3 (a INT);


SELECT * FROM tab3 ORDER BY a;
A(int)      |
总数目:0


--  创建存储过程(部分参数带有默认值)
CREATE PROCEDURE proc3 (arg1 INT, INT DEFAULT 200, arg3 INT DEFAULT 300) AS
BEGIN
   EXECUTE IMMEDIATE 'INSERT INTO tab3 VALUES (' || (arg1 + $2 + arg3) || ')';
END;

/

--  执行存储过程(不使用默认值)
EXEC proc3(10, 30, 60);


--  存储过程已向表中插入数据 100
SELECT * FROM tab3 ORDER BY a;
A(int)      |
------------
100         |
总数目:1



--  执行存储过程(使用部分默认值)
EXEC proc3(120, 180);


--  存储过程已向表中插入数据 600
SELECT * FROM tab3 ORDER BY a;
A(int)      |
------------
100         |
------------
600         |
总数目:2



--  执行存储过程(使用全部默认值)
EXEC proc3(500);


--  存储过程已向表中插入数据 1000
SELECT * FROM tab3 ORDER BY a;
A(int)      |
------------
100         |
------------
600         |
------------
1000        |
总数目:3


--  删除存储过程和表
DROP PROCEDURE proc3;
DROP TABLE tab3;