EsgynDB 存储过程SP/SQL

EsgynDB的新版本支持存储过程SP/SQL,语法与Oracle的PL/SQL大部分兼容。

语法

CREATE OR REPLACE PROCEDURE 
(
  [IN  in_param param_type,...]
  [OUT ou_param param_type,...]
)
IS
DECLARE
	param1 param_type;
    ...
BEGIN
    ...
EXCEPTION
    WHEN OTHERS THEN
    ...
END ;

创建方式

因为存储过程内部一般是包含多条语句,存储过程定义中会有多个分号,因此存储过程的创建不能像一般SQL那样可以用分号作为结束符,因此我们采用 / 作为存储过程创建的结束符,以下是一个在Trafci中创建简单存储过程的示例,最后的"/"代表存储过程创建结束符。

CREATE OR REPLACE PROCEDURE TEST_PROC
(
  IN  V_DATE     VARCHAR(100),
  OUT V_RETCODE  INT,
  OUT V_RETMSG   VARCHAR(200) CHARACTER SET UTF8
)
IS
DECLARE
	P_DATE VARCHAR(10);
BEGIN
    P_DATE := V_DATE;
	EXECUTE IMMEDIATE 'DROP TABLE IF EXISTS TEST_TBL';
	EXECUTE IMMEDIATE 'CREATE TABLE TEST_TBL(DT VARCHAR(100))';
	INSERT INTO TEST_TBL VALUES(P_DATE);
EXCEPTION
    WHEN OTHERS THEN
    V_RETCODE := SQLCODE;
    V_RETMSG := '错误信息:'||SQLERRM;
END TEST_PROC;
/

调用方式

调用方式我们采用CALL命令,对于上述示例存储过程的调用语句如下,

CALL TEST_PROC('2019-09-17',?,?);

以上采用?来代替OUT参数,表示匿名出参的意思,样例输出如下,

SQL>CALL TEST_PROC('2019-09-17',?,?);

V_RETCODE   V_RETMSG                                                                                                                        
----------- --------------------------------------------------------------------------------------------------------------------------------
       NULL NULL                                                                                                                            

--- SQL operation complete.

我们也可以采用指定参数名调用方式,

set param ?a NULL;
set param ?b NULL;
CALL TEST_PROC('2019-09-17',?a,?b);
SELECT ?a,?b FROM DUAL;

你可能感兴趣的:(EsgynDB 存储过程SP/SQL)