【问题标题】:Error in prepare Statement in Postgres stored procedurePostgres 存储过程中的准备语句错误
【发布时间】:2022-01-10 08:41:35
【问题描述】:

在 Postgres 中创建存储过程时,prepare 语句出现错误。

这是代码:

CREATE PROCEDURE public.deletebyidref(IN idref character varying, IN tablename character varying)
    LANGUAGE plpgsql
AS $$
DECLARE
   elapsed timestamp;
   t varchar(50);
   q varchar(50);
   w varchar(50);
   count int;
BEGIN

    elapsed := now(6);

    t := replace(tableName, ';', '&#059;');
    w := replace(idRef, ';', '&#059;');
    q := concat('delete from ', tableName, ' where idRef=''', w, '''');

    prepare stmt FROM q;
    execute q;
    count := row_count();
    deallocate prepare stmt;
    elapsed := timediff(now(6), elapsed);

END ;
$$;

任何帮助将不胜感激

【问题讨论】:

  • 为什么是prepare?您可以使用execute format('delete from ... where idref=$1') using w 简化它。 Postgres 中也没有 timediff() 函数。并且now() 在函数期间不会更改,因为它显示事务开始时的时间,您需要使用clock_timestamp()
  • “一个错误”,但错误是机密信息?

标签: sql postgresql plpgsql


【解决方案1】:

你不应该在 PL/pgSQL 中使用PREPARE 语句。这是 MySQL 如何运行动态 SQL 的方式。但是在 PL/pgSQL 中的 Postgres 中只需运行 EXECUTE 命令。

https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 2023-02-20
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多