pgsql 自定义函数中调用自定义函数

 项目背景:

        项目中给A表添加数据时会自动调用“触发器”给B表初始化默认数据(即:B表数据依赖于A表);

        现项目需要新增表C,在A表添加数据时也自动调用“触发器”给C表初始化默认数据;但因产品外部已在使用,需要兼容表A的数据已经添加完成的场景--因表A已存在数据,导致 A表中已存在数据,无法通过触发器给C表初始化默认数据;

解决方案:

        创建自定义函数funC:若C表中无数据--通过A表中数据,给C表初始化默认数据;

        创建自定义函数funA:判断A表中是否已存在数据;若存在--调用函数funC

        ----设备(linux 嵌入式设备)上电 数据库初始化阶段,pgsql数据库 调用函数funA 完成C表中初始化默认数据

代码如下:update.sql文件

1、创建C表

2、创建自定义函数 funC、funA

3、调用funA

--表A:park_info 停车表;表C:lcd_config 

park_info (
    park_id          RES_CODE PRIMARY KEY,            ---主键为库id
    park_name        varchar(128) ,                   ---停车名称
);


-- 步骤1:create table: lcd_config
CREATE TABLE IF NOT EXISTS lcd_config (
    config_id        RES_CODE PRIMARY KEY,           ---主键为库id
    park_id          INT REFERENCES park_info ON DELETE CASCADE,
    use_type         INT,                       --类型(入出)
    ……
);

-------------------------------------------------------------------

--步骤2:创建自定义函数

CREATE OR REPLACE FUNCTION funC()
RETURNS VARCHAR AS $$
DECLARE
    TMP_ID INTEGER; -- lcd配置id
    TMP_COUNT INTEGER; -- 停车总数
    TMP_ParkID INTEGER; -- 停车id
    i INTEGER; -- 循环索引
BEGIN
    select count(*) into TMP_COUNT from park_info ; 
    TMP_ParkID = 0;
	FOR i in 0..TMP_COUNT-1 LOOP	
		select config_id into TMP_ID from lcd_config order by config_id desc; -- 查找表中最大id,没有则置为0
	    if TMP_ID is null then
	        TMP_ID = 0;
	    end if;

    --循环获取停车ID
	select park_id into TMP_ParkID from park_info where park_id > TMP_ParkID order by park_id ASC; 

    --初始化C表默认数据
    insert into lcd_config (config_id, park_id, use_type) values(TMP_ID + 1, TMP_ParkID, 0);
	insert into lcd_config (config_id, park_id, use_type) values(TMP_ID + 2, TMP_ParkID, 1);

    ---此外,还可以初始化其他表中默认数据, 如下所示
    --insert into lcd_position_config(config_id, use_type, topleft_x, topleft_y, botright_x, botright_y) values(TMP_ID + 1, 0, 0, 100, 500, 600);

	END LOOP;
	RETURN 'create default lcd data end, park tbl is exist';
END;
$$ LANGUAGE plpgsql;

--------------------------------------

CREATE OR REPLACE FUNCTION funA()
RETURNS VARCHAR AS $$
BEGIN
    IF EXISTS (
        SELECT 1
        FROM park_info 
        WHERE park_id = 1
    ) THEN
        IF NOT EXISTS (
            SELECT 1
            FROM lcd_config
            WHERE park_id = 1
        ) THEN  
             --  lcd_config未初始化数据;        
			 RETURN funC();
        ELSE
        --  lcd_config已初始化数据;
        return 'default lcd data have created, park tbl is exist';
        END IF;
    ELSE
    -- 停车表数据不存在;
    return 'no need create default lcd data, park tbl is not exist';
    END IF;  
END;
$$ LANGUAGE plpgsql;

-------------------------------------------------------------------

--步骤3:调用函数
SELECT funA();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值