简单的更新集 postgres 存储过程

Posted

技术标签:

【中文标题】简单的更新集 postgres 存储过程【英文标题】:Simple update set postgres stored procedure 【发布时间】:2015-03-31 15:51:08 【问题描述】:

我在尝试使我的存储过程工作时遇到问题。

这是我的问题: 我有一个表,其中有一个名为a 的列,此列中有电话号码。

如果号码以1830 开头,我必须添加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。 ANDOR 之前绑定。

但最重要的是,您不需要 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 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

Postgres-存储过程 return 详解

oracle 存储过程,数据处理并返回结果集问题

使用 psycopg2 调用 postgres 存储过程 - 无效的事务终止

如果存储过程在 SQL Server 2005 上的选择之前进行更新,则没有结果集

存储过程 Postgres 和 Java

我可以在调用返回结果集但也更新行的存储过程的方法上使用@Transactional(readOnly = true) 吗?