简单的更新设置postgres存储过程

时间:2015-03-31 15:51:08

标签: sql postgresql stored-procedures sql-update plpgsql

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

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

如果号码以0039183开头,我必须添加0(如果不是,则必须保留原样)将新号码存储在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”不存在   第1行:选择子字符串(a为0表示2)!='00'和...

1 个答案:

答案 0 :(得分:0)

您的代码有两个错误:

  • 您不能引用列a,就像它是一个(不存在的)plpgsql变量一样。你也必须循环。您的方法根本不起作用
  • 你错了operator precedenceANDOR之前绑定。

但最重要的是,您不需要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