PostgreSQL函数中执行PERFORM INTO查询,能否通过temp获取balance值?
咱们一步步来解决你的问题哈:
问题1:从指定查询中获取值的正确写法
你给出的查询 PERFORM 1 into temp FROM master_balance where externalkey = 'jknfl12j3' and tenant_record_id = '2' for update; 本身存在语法错误——在PostgreSQL的PL/pgSQL中,PERFORM语句是用来执行不需要返回结果的SQL操作的,它不支持搭配INTO子句。
如果想要获取master_balance表中的字段值(比如balance),你需要改用SELECT ... INTO语法,示例如下:
-- 假设你要获取balance字段,先提前声明变量temp(类型要和balance字段匹配) SELECT balance INTO temp FROM master_balance WHERE externalkey = 'jknfl12j3' AND tenant_record_id = '2' FOR UPDATE;
问题2:函数内获取master表balance字段的实现方式
首先,你写的PERFORM 1 into temp FROM master ...同样存在语法错误,原因和上面一样——PERFORM不能和INTO混用。不过获取balance字段的值是完全可以实现的,至于能不能用temp.balance,关键看你怎么声明temp变量:
场景1:只需要单个balance字段的值
如果只需要balance这一个字段,你可以声明一个普通变量(类型和master.balance一致,比如numeric或integer),然后直接查询赋值:
DECLARE temp_balance numeric; -- 类型匹配你的balance字段 BEGIN -- 用SELECT INTO获取单个字段值 SELECT balance INTO temp_balance FROM master WHERE externalkey = 'jknfl12j3' AND tenant = '2' FOR UPDATE; -- 之后直接使用temp_balance变量即可,比如打印日志 RAISE NOTICE '获取到的余额是:%', temp_balance; END;
场景2:需要获取整行记录(包含balance)
如果你想获取该行的所有字段,包括balance,可以把temp声明为master表的行类型或者通用记录类型,这时候就可以用temp.balance来访问字段:
DECLARE temp master%ROWTYPE; -- 直接复用master表的行结构 BEGIN SELECT * INTO temp FROM master WHERE externalkey = 'jknfl12j3' AND tenant = '2' FOR UPDATE; -- 此时可以通过temp.balance获取balance字段的值 RAISE NOTICE '通过行类型变量获取余额:%', temp.balance; END;
额外注意事项
如果你的查询可能返回0行或者多行,建议加上INTO STRICT来确保恰好返回一行,避免函数抛出未处理的异常:
SELECT balance INTO STRICT temp_balance FROM master WHERE externalkey = 'jknfl12j3' AND tenant = '2' FOR UPDATE;
如果查询可能无结果,你可以捕获NO_DATA_FOUND异常;如果可能返回多行,捕获TOO_MANY_ROWS异常,让函数逻辑更健壮。
内容的提问来源于stack exchange,提问作者blinkbink

