更新游标的记录,其中表名是参数

2023-11-21

我正在调整一些 PL/pgSQL 代码,以便我的refcursor可以将表名作为参数。因此我更改了以下行:

declare
 pointCurs CURSOR FOR SELECT * from tableName for update;

与这个:

OPEN pointCurs FOR execute 'SELECT * FROM ' || quote_ident(tableName) for update;

我调整了循环,瞧,循环通过了。现在,在循环中的某个时刻,我需要更新记录(由光标指向),但我陷入了困境。我应该如何正确调整以下代码行?

UPDATE tableName set tp_id = pos where current of pointCurs;

我修正了报价tableName and pos并添加了EXECUTE条款在开头,但我收到错误where current of pointCurs.

问题:

  1. 我怎样才能更新记录?
  2. 该函数对于公共模式中的表可以正常工作,而对于其他模式中的表(例如,trace.myname)则失败。

任何评论都将受到高度赞赏..


回答(一)

1. 显式(未绑定)游标

EXECUTE不是一个“子句”,而是一个执行 SQL 字符串的 PL/pgSQL 命令。光标是不可见在命令里面。您需要将值传递给它。

因此,您不能使用特殊语法WHERE CURRENT OFcursor。我用的是系统栏ctid而是在不知道唯一列的名称的情况下确定行。注意ctid仅保证同一交易内稳定。

CREATE OR REPLACE FUNCTION f_curs1(_tbl text)
  RETURNS void AS
$func$
DECLARE
   _curs refcursor;
   rec record;
BEGIN
   OPEN _curs FOR EXECUTE 'SELECT * FROM ' || quote_ident(_tbl) FOR UPDATE;

   LOOP
      FETCH NEXT FROM _curs INTO rec;
      EXIT WHEN rec IS NULL;

      RAISE NOTICE '%', rec.tbl_id;

      EXECUTE format('UPDATE %I SET tbl_id = tbl_id + 10 WHERE ctid = $1', _tbl)
      USING rec.ctid;
   END LOOP;
END
$func$  LANGUAGE plpgsql;

Why format() with %I?

还有一个变体FOR循环游标的语句,但它只适用于bound光标。我们必须在这里使用未绑定的游标。

2. 隐式光标进入FOR loop

通常不需要对于 plpgsql 中的显式游标。使用 a 的隐式游标FOR循环代替:

CREATE OR REPLACE FUNCTION f_curs2(_tbl text)
  RETURNS void AS
$func$
DECLARE
   _ctid tid;
BEGIN
   FOR _ctid IN EXECUTE 'SELECT ctid FROM ' || quote_ident(_tbl) FOR UPDATE
   LOOP
      EXECUTE format('UPDATE %I SET tbl_id = tbl_id + 100 WHERE ctid = $1', _tbl)
      USING _ctid;
   END LOOP;
END
$func$  LANGUAGE plpgsql;

3. 基于集合的方法

或者更好(如果可能的话!):根据基于集合的操作重新思考您的问题并执行单个(动态)SQL 命令:

-- Set-base dynamic SQL
CREATE OR REPLACE FUNCTION f_nocurs(_tbl text)
  RETURNS void AS
$func$
BEGIN
   EXECUTE format('UPDATE %I SET tbl_id = tbl_id + 1000', _tbl);
   -- add WHERE clause as needed
END
$func$  LANGUAGE plpgsql;

SQL小提琴演示所有 3 个变体。

回答(二)

模式限定的表名,例如trace.myname实际上包括two身份标识。你必须

  • 要么通过并逃离他们分别地,
  • 或与更优雅的方法使用一个regclass type:
CREATE OR REPLACE FUNCTION f_nocurs(_tbl regclass)
  RETURNS void AS
$func$
BEGIN
   EXECUTE format('UPDATE %s SET tbl_id = tbl_id + 1000', _tbl);
END
$func$  LANGUAGE plpgsql;

我从%I to %s,因为regclass当(自动)转换为时参数会自动正确转义text.
此相关答案中的更多详细信息:

  • 表名作为 PostgreSQL 函数参数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新游标的记录,其中表名是参数 的相关文章

  • 数据库错误:值对于类型字符变化来说太长(100)

    我有一个 Django 网站 运行我们几年前在内部构建的迷你 CMS 它使用 postgresql 保存简单的标题和一段文本时 出现以下错误 value too long for type character varying 100 奇怪的
  • 如何在 pgAdmin III 中为多个表生成 CREATE 脚本?

    在 pgAdmin III 中您可以 右键单击表格 scripts 创建脚本 从 SQL 编辑器保存脚本 如果必须对多个表执行此操作 是否有一种方法可以将脚本合并到一个文件中 除了手动复制粘贴它们之外 如果这可以通过 psql 提示符或 p
  • 在 Rails 中禁用连接池以使用 PgBouncer

    我们有一个 Ruby on Rails 4 2 8 项目 可以访问大型 PostgreSQL 数据库 我们将使用 PgBouncer 添加一个新的连接池服务器 由于 PgBouncer 将处理数据库连接池 我们是否需要关闭 Rails 自动
  • 如何使用 typeorm 在 postgres 中保存 json 对象数组

    我正在尝试在 postgres 中保存 jsonb 类型的对象数组 Entity Column type jsonb array true nullable true testJson object 我在邮递员中发送的json testJs
  • 使用 JSON 参数的 Postgres 批量 INSERT 函数

    这是一个plpgsqlpostgres 的函数9 6 它试图INSERT一行 如果插入没有失败 由于违反键约束 那么它会运行更多命令 CREATE FUNCTION foo int text text RETURNS void AS BEG
  • 如何从 PostgreSQL 中的时间戳列值提取一天中的时间(或小时)?

    我正在尝试从 PostgreSQL 中的 时间戳 列中提取一天中的时间 这是我的做法 但是 太糟糕了 知道如何做得更好吗 SELECT date part hour date demande text hours date part min
  • PESSIMISTIC_WRITE 是否锁定整个表?

    只是为了确保我正确理解事情是如何运作的 If I do em lock employee LockModeType PESSIMISTIC WRITE 它会仅阻止该实体吗 employee 或整个表Employees 如果重要的话 我正在谈
  • 检查 postgres 复制状态

    有人可以建议检查 postgresql 复制状态的步骤以及如何确定复制是否未正确进行吗 我们在 pgsql9 0 和 pgsql9 4 中使用流复制 我通常使用以下 SQL 查询来检查 Postgres v11 的状态 关于主人 selec
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • Postgres 中的输出 Inserted.id 等效项

    我是 PostgreSQL 新手 正在尝试将 mssql 脚本转换为 Postgres 对于合并语句 我们可以使用冲突更新插入或不执行任何操作 但我使用下面的语句 不确定这是否是正确的方法 MSSQL代码 Declare tab2 New
  • 根据日期顺序排名

    我的数据如下 Heading Date A 2009 02 01 B 2009 02 03 c 2009 02 05 d 2009 02 06 e 2009 02 08 我需要如下排名 Heading Date Rank A 2009 02
  • 将 UNNEST 与 jOOQ 结合使用

    我正在使用 PostgreSQL 9 4 Spring Boot 1 3 2 和 jOOQ 3 7 我想 jOOQify 以下查询 SELECT id FROM users WHERE username IN SELECT FROM UNN
  • 由于键更改而尝试插入时外键约束失败

    我有一个 Content 对象 它引用多对多关系中的一组 Tag 对象 作为持久化新内容对象的一部分 我在 PostgreSQL 中查看标签是否已存在 如果存在 则将对其的引用添加到内容对象并尝试保存内容对象 我遇到的问题是 当我这样做时
  • JDBC插入实数数组

    我试图将一个真实的数组插入到 postgresql 数组中 该表的定义是 String sqlTable CREATE TABLE IF NOT EXISTS ccmBlock sampleId INTEGER block REAL 插入内
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • 从postgresql中的jsonb嵌套数组中删除键值对

    我有 jsonb 数据作为 a b 1 c 2 d 3 b 4 c 5 d 6 g b 1 c 2 d 3 b 4 c 5 d 6 我想从 a 和 g 键的嵌套数组中删除 c 键 是否有一个查询可以执行此操作 SELECT jsonb ob
  • Supabase 客户端权限被拒绝,模式为 public

    每当我尝试使用 supabase supabase js 查询数据库时 都会收到错误 error hint null details null code 42501 message permission denied for schema
  • 转义 to_tsquery 中的特殊字符

    如何转义传递给的字符串中的特殊字符to tsquery 例如 这种查询 select to tsquery AT T 生产 NOTICE text search query contains only stop words or doesn
  • 有什么方法可以加快 Postgres 位图堆扫描速度吗?

    这里是数据库新手 这是我的查询 我使用的是 Postgres 9 3 5 explain analyse SELECT SUM actual cost as cost SUM total items as num items process
  • PostgreSQL ST_AsMVT 到 VectorTiles 到 Leaflet 层

    我正在尝试从 PostgreSQL 数据库创建矢量切片 并通过 Flask 将它们提供给 Leaflet 地图 我已经关注了这个medium com 文章 https medium com tantotanto vector tiles p

随机推荐

  • 具有不同签名的两个主要方法

    我有以下课程 public class Test public static void main Integer args System out println This is not a main public static void m
  • 用双反斜杠替换单反斜杠需要八个反斜杠吗?

    这是一个 这里到底发生了什么 的问题 我实际上不需要解决方案 我必须用双反斜杠替换 String 中的所有单反斜杠 这就是我最终所做的 strRootDirectory strRootDirectory replaceAll 其中 strR
  • 删除字符串开头和结尾的所有分隔符

    在折叠行并使用分号分隔后 我想删除字符串前面和后面的分号 多个分号代表单元格中的空白 例如 崩溃后的观察结果可能如下所示 TX PA CA 我希望单元格看起来像这样 TX PA CA 这是我的折叠代码 new df lt group by
  • Terraform 将 2 个变量合并为一个新变量

    我想在具有大量端口组的环境中自动部署 Vmware 虚拟机 为了能够选择正确的端口组 最好输入租户和环境这两个变量 这两个变量用于 CMDB 注册和部署目的 对于部署 需要将变量合并为 1 个新变量以选择正确的端口组 由于插值语法 似乎不可
  • 检测移动到 Mobile Safari 中的新选项卡

    我有一系列打开弹出窗口的页面 Mobile Safari 中的新选项卡 每个弹出窗口都需要知道它们何时获得焦点 在桌面上 我们使用window onblur and window onfocus来驱动这种行为 然而 这些事件在 iPad 上
  • 将枚举变体用作函数的奇怪语法是什么?

    下面是example由 mod 文档给出syn parse enum Item Struct ItemStruct Enum ItemEnum struct ItemStruct struct token Token struct iden
  • WinForm 应用程序中的安全连接字符串

    如何保护 WinForm 应用程序中的 ConnectionString 你不能 尽管您可以加密 app config 文件中的连接字符串 但应用程序需要能够对其进行解密 因此始终可以检索未加密的连接字符串 尤其是对于托管应用程序 可能不适
  • 如何在默认程序中打开文件 - Linux

    如何以编程方式在 Linux 中的默认程序中打开文件 我使用的是 Ubuntu 10 10 例如 打开 mp3 将在电影播放器 或其他东西 中打开该文件 你需要跑gnome open kde open 或 exo open 取决于您使用的桌
  • 为什么我无法在此 Spring Boot 应用程序中处理分段上传?我收到“找不到匹配的编辑器或转换策略”

    我正在研究一个春季启动应用程序 我发现尝试实现处理以下问题的控制器方法有些困难分段文件上传 为了做到这一点 我已经调整了这个春季MVC教程 http www codejava net coding upload files to datab
  • 使用 JSF h:outputLink 生成页面锚点

    简单的问题 如何创建 HTML 锚点 例如 a a with JSF e g
  • 非阻塞控制台输入?

    我正在尝试用 Python 制作一个简单的 IRC 客户端 作为我学习该语言时的一种项目 我有一个循环来接收和解析 IRC 服务器发送给我的内容 但是如果我使用raw input输入内容时 它会停止循环 直到我输入内容 显然 如何在不停止循
  • 工作表每行上不需要的符号

    我不知道我不小心点击的热键是什么 但是这个 每行代码上都出现了 look 标志 代码中没有空格 而是灰点 我怎样才能摆脱这些角色 假设这是 SQL Developer 请转到 工具 gt 首选项 或者在 Mac 上 在 SQL Develo
  • 如何在 Dart 中运行重复出现的函数?

    我想一遍又一遍地运行一个函数 中间有一个延迟 我怎样才能用 Dart 做到这一点 您可以使用Timer类来安排一次性和重复功能 重复 以下是运行重复函数的方法 import dart async main const oneSec Dura
  • Sveltekit + Typescript:环境变量构建错误

    我想在我的 Sveltekit 应用程序中使用环境变量 它在开发服务器上运行良好 但我收到此构建错误 Error PUBLIC KEY is not exported by env static public imported by src
  • 初始化谷歌地图时,mapFragment.getMapAsync(this)处出现空指针异常

    当我使用 Google Play Services v6 5 87 时 调用时出现空指针异常getMapAsync 我正在使用一个SupportMapFragment in my Fragment的 xml 布局 My code Suppo
  • Clojure 理解示例

    我在用docjure它的选择列功能需要一个列映射 我想获取所有列 而无需手动指定 如何生成以下惰性无限向量序列 A B C D E AA AB AC ZZ XFD 你的问题归结为 如何将数字转换为包含字母 A Z 的 26 进制字符串 这是
  • 使用OpenGL替代Canvas - Android

    我正在尝试用更快的 opengl es 表面替换我已经拥有的基于 Canvas 的渲染系统 但是 我似乎无法让 openGL 渲染器以充当 2d 场的方式符合 而不是透视图 我当前的渲染器代码如下所示 Override public voi
  • 是否可以复制某个控件的所有属性? (C# 窗口窗体)

    例如 我有一个DataGridView用蓝色控制BackgroundColor属性等 有没有一种方法可以以编程方式将这些属性转移或传递给另一个属性DataGridView控制 像这样的东西 dtGrid2 Property dtGrid1
  • \G 在 .split 中如何工作?

    我喜欢用 Java 进行代码高尔夫 尽管 Java 过于冗长而缺乏竞争力 即用尽可能少的字节完成某个挑战 在我的一个答案中 我有以下代码 for var p A4 B8 CU EM EW E3 G6 G9 I1 L7 NZ O0 R2 S5
  • 更新游标的记录,其中表名是参数

    我正在调整一些 PL pgSQL 代码 以便我的refcursor可以将表名作为参数 因此我更改了以下行 declare pointCurs CURSOR FOR SELECT from tableName for update 与这个 O