简单的更新集 postgres 存储过程
Posted
技术标签:
【中文标题】简单的更新集 postgres 存储过程【英文标题】:Simple update set postgres stored procedure 【发布时间】:2015-03-31 15:51:08 【问题描述】:我在尝试使我的存储过程工作时遇到问题。
这是我的问题:
我有一个表,其中有一个名为a
的列,此列中有电话号码。
如果号码以1
、8
、3
或0
开头,我必须添加0039
(如果不是,则保持原样)并将新号码存储在 b 列中。
这是我的代码:
CREATE OR REPLACE FUNCTION upg_table() RETURNS void AS $$
BEGIN
IF (substring(a from 0 for 2)!='00')
AND (substring( a from 0 for 1)='3')
OR (substring(a from 0 for 1)='0')
OR (substring(a from 0 for 1)='1')
OR ( substring(a from 0 for 1)='8')
THEN
UPDATE cdr
SET
b = '0039'||a;
ELSE
UPDATE cdr
SET
b = a;
END IF;
END;
$$ LANGUAGE plpgsql;
错误是:
错误:“a”列不存在 ROW 1: SELECT substring(a from 0 for 2)!='00' AND ...
【问题讨论】:
乍一看,您的布尔逻辑看起来不正常。你应该在你的想法周围加上括号。喜欢(sub1 AND sub2) OR (sub3 AND sub4)
您的错误来自您没有从任何地方声明或拉取a
的事实。我认为您需要将 if 语句更改为 select case
。
在您的if
语句中,您只能引用变量或参数。但是您既没有名为 a
的变量,也没有名为 a
的参数
【参考方案1】:
您的代码有两个错误:
您不能引用列a
,就像它是一个(不存在的)plpgsql 变量一样。你也必须循环。您的方法根本行不通。
你弄错了operator precedence。 AND
在 OR
之前绑定。
但最重要的是,您不需要 plpgsql 函数。一个普通的UPDATE
就可以完成这项工作:
UPDATE cdr
SET b = CASE WHEN left(a, 1) IN ('0', '1', '3', '8')
AND left(a, 2) <> '00'
THEN '0039' || a ELSE a END;
这会更新所有行中的b
,但只有一些更改了a
。
【讨论】:
以上是关于简单的更新集 postgres 存储过程的主要内容,如果未能解决你的问题,请参考以下文章
使用 psycopg2 调用 postgres 存储过程 - 无效的事务终止
如果存储过程在 SQL Server 2005 上的选择之前进行更新,则没有结果集
我可以在调用返回结果集但也更新行的存储过程的方法上使用@Transactional(readOnly = true) 吗?