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);这样就简化了临时表的创建过程。
