【问题标题】:Fully replace a record with unbound PostgreSQL cursor用未绑定的 PostgreSQL 游标完全替换记录
【发布时间】:2019-10-17 13:26:39
【问题描述】:

是否可以使用未绑定的游标来完全编辑和替换表格中的一行?

我正在使用未绑定游标,因为表是通过参数动态指定的,但我不能使用“UPDATE table SET column = value WHERE”语法,因为列未指定。

CREATE OR REPLACE FUNCTION trim_table(in_table TEXT) AS $$
  DECLARE
    ref REFCURSOR;
    current_row RECORD;
BEGIN
  OPEN ref FOR EXECUTE 'SELECT * FROM '|| quote_ident(in_table);
  LOOP
    FETCH ref INTO current_row;
    EXIT WHEN NOT FOUND;
    current_row = my_row_function(current_row);
    /*How can I replace my row here?*/
  END LOOP;
  CLOSE ref;
END
$$ LANGUAGE plpgsql;

我找到的所有示例和答案仅显示如何更新单个字段而不是完整记录。

【问题讨论】:

  • 您需要在“my_row_function”中做什么?
  • 具体来说,删除文本字段中的每个空格
  • 当您说修剪掉:文本字段中间的空格? (我之前无法连接到答案:抱歉;))我有一个想法可以在没有任何光标的情况下解决您的问题,如果您想要的话,我认为会更快。
  • 不,我只想在字符串的开头或结尾修剪掉输入错误的空格

标签: postgresql sql-update database-cursor


【解决方案1】:

我认为这段代码可以在某些方面帮助你:

select 
    string_agg('UPDATE '||table_schema||'.'||table_name||chr(13)||' SET '||column_name||' = TRIM('||column_name||')', '; '||chr(13)) into query
from information_schema.columns
where data_type in ('varchar', 'text')
    and table_schema = 'your_schema'
    and table_name = 'your_table_name';

execute query;

把它放在你的过程中,根据你的方便修改它,你就不再需要这个循环了。

【讨论】:

  • 这不会修剪列名中的空格吗?我正在尝试修剪记录
  • 查看将要执行的内容:删除“进入查询”部分并使用您的表和模式名称进行选择。你会看看它是否是你想要的;)
  • 为了更正确地回答您的评论:我不在这里逐行更新。我更新给定表的所有 text 和 varchar 列中的所有值。
  • 这是什么魔法!我在数据类型和查询长度检查中添加了“字符变化”,它起作用了!虽然它没有回答直接的问题,但这是我从一开始就真正想做的事情。
  • 在许多情况下,向这个社区公开问题的最佳方式是直接表达您的基本需求,而不是您的技术问题,而是功能问题。我很高兴这有帮助。
猜你喜欢
  • 2014-04-15
  • 2017-07-06
  • 2017-08-02
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多