ORACLE存储过程调用自定义函数

在写存储过程的时候经常要创建临时表组织数据,创建临时表的时候需要判断该表是否已经存在。
V_SQL:=CREATE TABLE BI_ZJ_ZJGJ(
            ZHZBH VARCHAR2(20),
            ZHZMC VARCHAR2(50),
            DWBH VARCHAR2(20),
            DWMC VARCHAR2(100),
            ZHNM VARCHAR2(50),
            ZHMC VARCHAR2(200),
            HBZJ NUMBER(20,8),
            YGJZJ NUMBER(20,8),
            GJL NUMBER(20,8)
            );

    SELECT COUNT(1) INTO V_FLAG FROM USER_TABLES WHERE TABLE_NAME=BI_ZJ_ZJGJ;
    IF V_FLAG=0 THEN
       EXECUTE IMMEDIATE V_SQL;
    ELSE
       EXECUTE IMMEDIATE DROP TABLE BI_ZJ_ZJGJ;
       EXECUTE IMMEDIATE V_SQL;
    END IF;

碰到一个存储过程里面要使用多张临时表的时候就要多次重复粘贴该代码了,那为什么不将创建临时表的语句独立出来形成函数,然后在存储过程里面调用呢?

因此建立一个BI_TEMP_TAB的函数,接收建表语句V_SQL和表名V_NAME,返回一个布尔值表示临时表创建成功。

CREATE OR REPLACE FUNCTION BI_TEMP_TAB(V_SQL VARCHAR2,V_NAME VARCHAR2)
       RETURN BOOLEAN
AS
       V_FLAG VARCHAR(10);
       V_OK BOOLEAN;
BEGIN
       SELECT COUNT(1) INTO V_FLAG FROM USER_TABLES WHERE TABLE_NAME=V_NAME;
       V_OK:=True;
              IF V_FLAG=0 THEN
                 EXECUTE IMMEDIATE V_SQL;
                 RETURN V_OK;
              ELSE
                 EXECUTE IMMEDIATE DROP TABLE ||V_NAME;
                 EXECUTE IMMEDIATE V_SQL;
                 RETURN V_OK;
               END IF;
END;

在存储过程中需要创建临时表的时候就直接调用该函数:

V_SQL:=CREATE TABLE BI_ZJ_ZJCFB AS
            SELECT C.ZJZH_ZHBH,C.ZJZH_ZHNM,C.ZJZH_MC,C.ZJZH_ZHZ,E.ZJZHZ_MC,
            C.ZJZH_XZBH,D.ZJZHXZ_XZMC,C.ZJZH_DWBH,A.CODE,A.NAME
            FROM CODEITEMS A,BANKS B,ZJZH C,ZJZHXZ D,ZJZHZ E
            WHERE A.CODE=B.BANKTYPE
            AND   B.BANKID=C.ZJZH_BANKID
            AND   C.ZJZH_XZBH=D.ZJZHXZ_XZBH
            AND   C.ZJZH_ZHZ=E.ZJZHZ_ZHZBH
            AND   A.SETID=A009
            AND   C.ZJZH_XZBH<>04
            ORDER BY C.ZJZH_DWBH;

    V_OK:=BI_TEMP_TAB(V_SQL,BI_ZJ_ZJCFB);
这样就简化了临时表的创建过程。
经验分享 程序员 微信小程序 职场和发展