当前位置: 首页 > 面试题库 >

将复合类型的数组传递给存储过程

孔经武
2023-03-14
问题内容

我在形成文字时可能做错了。假设我有一个简单的存储过程,如下所示:

CREATE OR REPLACE FUNCTION do_something(input_array composite_type[])
  RETURNS SETOF text AS
$BODY$
DECLARE
    temp_var composite_type;
BEGIN

    FOR temp_var IN SELECT unnest(input_array) LOOP
        return next temp_var.message;
    END LOOP;

END
$BODY$
  LANGUAGE plpgsql;

composite_type定义为:

CREATE TYPE composite_type AS
   (message text,
    amount numeric(16,2));

执行这样的查询:

SELECT * FROM do_something('{"(test,11)","(test2,22)"}')

产生以下结果集:

(test,11.00)
(test2,22.00)

代替:

test
test2

我的文字是否有问题,还是应该message以其他方式访问该字段?感谢您的任何建议。


问题答案:

指定输入的方式看起来不错,因为使用行和数组构造器语法可以观察到相同的行为:

SELECT * FROM do_something( ARRAY[ ROW('test',11), ROW('test2',22) ]::composite_type[] );

和:

SELECT ARRAY[ ROW('test',11), ROW('test2',22) ]::composite_type[];

产生:

 '{"(test,11.00)","(test2,22.00)"}'

如果添加:

 RAISE NOTICE '!%!',temp_var;

循环内部,输出为:

NOTICE:  !("(test,11.00)",)!
NOTICE:  !("(test2,22.00)",)!

表明您实际上正在获取一个元组,其中“ message”是您期望的元组文本,并且为空“ amount”。

所以。为什么?

这有点微妙。您正在使用:

SELECT unnest(input_array)

这似乎可以满足您的要求,对:

regress=>     SELECT unnest( ARRAY[ ROW('test',11), ROW('test2',22) ]::composite_type[] );
    unnest     
---------------
 (test,11.00)
 (test2,22.00)
(2 rows)

…但是实际上,它返回的是type的 单个列composite_type。PL / PgSQL复合类型分配期望 每个类型列有一个列
。因此,单个列被推到“消息”中,没有第二个列。

相反,写:

SELECT * FROM unnest(input_array)

解压复合材料以进行分配。然后它按预期工作:

regress=> SELECT * FROM do_something( ARRAY[ ROW('test',11), ROW('test2',22) ]::composite_type[] );
 do_something 
--------------
 test
 test2
(2 rows)

如果的第一个字段composite_type为非文本类型,则您将得到一个错误信息,该错误信息会提供更多信息。



 类似资料:
  • 问题内容: 我需要将字符串数组作为参数传递给MySQL存储例程。该数组可能很长,其元素数量不是固定的。然后,我想将字符串值放入具有一列的内存表中,以便可以处理数据。我不知道这是否可以在MySQL中完成。也许需要肮脏的解决方法。 例如,我有字符串值: 现在,我想从MySQL 表中获取有关这些水果的数据。伪代码: Microsoft SQL Server允许您使用数据类型并将数组作为XML字符串提交,

  • 根据本指南,我能够将简单数据类型(如)的关联数组传递给PL/SQL过程。 可以这么说: 但是,我想调用下面的过程,取而代之的是复杂类型。 我尝试过各种方法,比如: 以下是失败的: 看起来您可以在包之外创建一个类型并引用它。 引用它: 但是,您不允许在包之外创建关联数组的RECORD。我可以用对象替换RECORD,但是我想不出任何东西可以替换关联数组,这是cx_Oracle可以传入或传出的唯一集合类

  • 我正在从Spring中调用一个存储过程,但是我需要向存储过程传递一个字符串数组。然而,到目前为止,我遇到了一个又一个错误。你知道哪里出了问题吗? 我尝试运行以下测试。 这是我得到的stacktrace。

  • 问题内容: 我想将两个数组形式的java发送到oracle存储过程。第一个数组是字符串数组,第二个是字符数组,我怎样才能做到这一点? 问题答案: 这是一个如何做的例子。 以下脚本在数据库中设置表,类型和存储过程。该过程采用数组类型的参数,并将数组的每一行插入表中: 然后,Java代码演示如何将数组传递到此存储过程中: 如果先运行SQL脚本,然后运行Java类,然后查询表,则应该发现所有数据都已插入

  • 我在HANA数据库中创建了这个存储过程,它使用两个参数,一个是表类型,另一个是。 现在我想在Java中调用这个过程,我写了这样的东西。 有人能告诉我在调用此存储过程时,如何将对象作为参数中的表实体传递吗?

  • 问题内容: 我在SQL Server中创建了用户定义的表类型: 我正在使用存储过程将记录插入数据库中: 而且我想使用EF执行此存储过程,但这是问题所在:如何将用户定义的表传递给存储过程? 我尝试将存储过程添加到模型中,但是无法在更新的上下文中找到所需的存储过程。 我要执行的操作是对表执行批量插入,这是我当前正在使用的方法: 当前,我使用循环在列表中循环以将项目插入DB,但是如果列表中有很多项目,则