【问题标题】:issue when executing the pgsql complaining about loop执行 pgsql 时出现问题,抱怨循环
【发布时间】:2020-12-26 01:07:31
【问题描述】:
create or replace function f() RETURNS void AS 

declare
   tableArray text[] := '{"ADDRESS","CONSISTENCY_CHECK","DEPARTMENT_SUPERVISION"}';
   tableName CHARACTER VARYING;
   value INTEGER ;
   
BEGIN
 FOREACH  tableName IN ARRAY tableArray 
 LOOP   
     select user_id from tableName where user_id=2631;
       if found then
         update tableName set user_id=2651 where user_id=2631;
         delete from tableName where user_id=2631;
  END loop;
end;

这是我在尝试执行 pgplsql 时遇到的错误:ERROR syntax error at or near "loop"

【问题讨论】:

  • 函数体必须是字符串文字,通常使用美元引号。
  • 我没有在函数体周围看到 $$ 块。

标签: arrays postgresql loops plpgsql


【解决方案1】:

还有更多问题:

  1. 函数的主体应该是字符串 - 您可以使用撇号或更常用和实用的 $$ 自定义字符串分隔符。

  2. SELECT 的结果不应丢失。子句INTO 丢失。

  3. 表名不应该是变量 - 变量不能用作表名。在这种情况下,您需要动态 SQL - EXECUTE 语句。

  4. 变量名的骆驼表示法不应该用于 SQL 语言,即不区分大小写

    CREATE OR REPLACE FUNCTION f() 
    RETURNS void AS $$
    DECLARE
      table_array text[] := '{"ADDRESS","CONSISTENCY_CHECK","DEPARTMENT_SUPERVISION"}';
      table_name text;
      value integer ;
      rc integer
    BEGIN
      FOREACH  table_name IN ARRAY table_array 
      LOOP
        EXECUTE format('SELECT * FROM %I WHERE user_id = $1', table_name) USING 2631;
        -- variable FOUND cannot be used for dynamic SQL
        GET DIAGNOSTICS rc = ROW_COUNT;
        IF rc > 0 THEN
          EXECUTE format('UPDATE %I SET user_id = $1 WHERE user_id = $2', table_name) USING 2651, 2631;
          EXECUTE format('DELETE %I WHERE user_id = $1', table_name) USING 2631;
         END IF;
       END LOOP;
     END;
     $$ LANGUAGE plpgsql;
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多