【问题标题】:postgresql function text parameter splitting uppostgresql 函数文本参数拆分
【发布时间】:2021-10-11 12:22:17
【问题描述】:

我创建了以下 postgres 函数

CREATE OR REPLACE FUNCTION public.fn(param TEXT)
RETURNS void
LANGUAGE plpgsql
AS
$$
DECLARE param TEXT;
BEGIN
    DELETE FROM public."table_name"
    WHERE "column_name" = param;
END
$$

我尝试将字符串作为参数传递:

293507407
<class 'str'>

但我总是遇到以下错误:

psycopg2.errors.UndefinedFunction: function fn(unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown) does not exist
LINE 1: SELECT * FROM fn('2','9','3','5','0','7','4','0'...
                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
'''

我已经尝试了所有可能的转换,无论是在我的 python 代码中还是在函数本身中。然而,没有任何运气。

我在这里做错了什么?

【问题讨论】:

  • 你如何调用你的函数?
  • 我使用:cursor.callproc(fn, param)

标签: python postgresql stored-functions


【解决方案1】:
  1. param TEXT 不需要在 DECLARE 部分重复,因为它已经定义为参数

  2. cursor.callproc(fn, param) 应该是 cursor.callproc(fn, [param])。您现在拥有它的方式“293507407”正在获取一系列字符,例如fn('2','9','3','5','0','7','4','0'... 有关使用信息,请参阅 callproc

  3. 不要使用callproc,在 psycopg3 中它不会存在。只需使用execute 即可运行该功能。这也适用于 Postgres 过程,尽管有名称,但不能在 callproc 中使用。

【讨论】:

  • 其实我已经尝试过 [param] 解决方案。它确实有效地解决了 fn('2','9','3', ...) 问题。不幸的是,我的查询没有找到它。
  • 您需要将您的查询添加为对您的问题的更新,如“...没有被我的查询选中。”不清楚。
  • 其实我已经尝试过 [param] 解决方案,但它并没有被我的函数所接受。我的函数需要括号“参数”之间的参数值。我尝试通过我的python代码添加括号,但这也不起作用。此外,quote_literal 或quote_ident 不能解决问题。
  • 这是我的原始查询(函数外):DELETE FROM public."table_name" WHERE "column_name" = \'param\';
  • 请按照说明将您的疑问和解释添加到您的问题中,这样其他人就不必通过所有的 cmets 来获取信息。也不知道DELETE 查询与您的问题有什么关系?仅供参考,请阅读SQL parameters。显示您在 Python 代码中使用 callproc 时使用的实际完整查询
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
相关资源
最近更新 更多