如何正确地传递从Django的/ Python的阵列的Postgres / PLPGSQL存储过程可变参数的参数

问题描述 投票:0回答:1

我想打电话从Django的/ Python的上的Postgres / PLPGSQL一个存储过程。我已在存储过程使用可变参数的参数定义:

CREATE OR REPLACE FUNCTION udf_getmultiplecategoriescodetypes (VARIADIC NUMERIC[])

然后我想用的参数数组在proc的唯一地方是在WHERE语句:

WHERE cct.code_category_fk_id = ANY($1)

这一切都完美的作品时,我打电话从DBeaver控制台的功能:

SELECT * FROM udf_getmultiplecategoriescodetypes(1, 2)

但是,如果我用在Django / Python中callproc功能,使用相同类型的语法,就像这样:

c.callproc("udf_getmultpilecategoriescodetypes", (1, 2))

我得到的错误:

LINE 1: SELECT * FROM udf_getmultpilecategoriescodetypes(1,2)
HINT:  No function matches the given name and argument types. You might need to add
explicit type casts.

function udf_getmultpilecategoriescodetypes(integer, integer) does not exist

此外,在DBeaver,创建并存储在功能上市,如果我尝试删除它的功能时,它说的功能不能被发现。

Function Showing in TreeView

Deletion Error Msg

因为我已经发现我可以用DROP FUNCTION并包括一个可变参数,以便识别出它基于数量和参数类型删除。但是,为什么会这样?

于是,两个问题:

  1. 什么是从一个Django / Python的callproc功能整数数组传递到一个Postgres / PLPGSQL存储过程一个可变参数参数的正确方法是什么?
  2. 为什么DBeaver不能识别列出的存储过程的功能时的阵列或可变参数被用作参数现有?而这可能会以某种方式涉及到callproc错误,因为这两个问题的错误似乎与一个可变参数?
python django postgresql stored-procedures variadic-functions
1个回答
0
投票
  1. 什么是从一个Django / Python的callproc功能整数数组传递到一个Postgres / PGPLSQL存储过程一个可变参数参数的正确方法是什么?

您定义的参数为VARIADIC NUMERIC[],让你真正想传递numeric的阵列,而不是整数数组。

而且因为它是一个VARIADIC功能,你可以通过numeric值而不是实际的数组列表 - 像你一样。看到:

但是,这不是手头的问题。 Postgres的function type resolution将回落到func(numeric[])如果没有func(int[])。似乎是一个简单的错字。你看得到差别吗?

udf_getmultiplecategoriescodetypes
udf_getmultpilecategoriescodetypes

Conciser的名字也许有些下划线可能有助于防止这样的错别字。

  1. 为什么DBeaver不能识别列出的存储过程的功能时的阵列或可变参数被用作参数现有?而这可能会以某种方式涉及到callproc错误,因为这两个问题的错误似乎与一个可变参数?

Postgres允许函数重载。因此,函数签名由它的名称和参数是明确的。 DBeaver无关吧。

在它的上面,要知道,同样的功能可以在多种模式存在。所以一定要使用正确的search_path操作,没有(和无意中调用)另一个模式的副本。

所以你尝试删除函数public.udf_getmultiplecategoriescodetypes()由于缺少参数失败。它也可以,如果函数在不同的模式中创建失败。

有关:

© www.soinside.com 2019 - 2024. All rights reserved.