【问题标题】:How to pass field values as arguement to a stored procedure如何将字段值作为参数传递给存储过程
【发布时间】:2016-01-25 09:36:53
【问题描述】:

我有一个数据库表,其中一列有一组值。 让我们假设

Student table
"Name" character(10),
"Subject_studying" text[],

我创建了一个存储过程如下

CREATE OR REPLACE FUNCTION ArrayLike(vals text[], v text) RETURNS integer AS $$
DECLARE
  str text;
BEGIN
  v := replace(replace(v, '%', '.*'), '_', '.');
  FOREACH str IN ARRAY vals LOOP
    IF str ~* v THEN
      RETURN 1;
    END IF;
  END LOOP;
  RETURN 0;
END; $$ 
LANGUAGE PLPGSQL;

返回我正在寻找的所有主题。 如何将主题的参数传递给存储过程。

我的查询看起来像

SELECT Name FROM Student WHERE ArrayLike('Subject_studying', 'english') = 1

查询给了我一个错误

 ERROR:  FOREACH expression must not be null
CONTEXT:  PL/pgSQL function Arraylike(text[],text) line 6 at FOREACH over array
********** Error **********

我猜参数 'Subject_studing' 不是作为一个值发送的,而是作为一个简单的字符串发送的。我们如何将该字段中的值传递给存储过程?

【问题讨论】:

  • 您的查询肯定被错误引用,应该是 ArrayLike("Subject_studying", 'english') (或者,如果可以的话,在任何地方都省略双引号 -- 引用标识符很容易变得混乱 -- Postgres 的文档还建议您应始终使用标识符引号,或从不)。但是,当然,如果您唯一的错误是这个,您应该会收到不同的错误消息。这是您的问题中的拼写错误,还是该查询实际上产生了该错误消息?

标签: sql postgresql stored-procedures


【解决方案1】:

正如您已经指出的,该错误是由将列名 subject_studying 作为字符串传递引起的。取消引用以使错误消失。

但实际上您不必为此创建自己的函数。您可以使用内置的ANY 运算符:

SELECT Name FROM Student WHERE 'english' = ANY(subject_studying);

【讨论】:

  • 我想在字段数组上应用类似过滤器。如果我将争论发送为“physi”,就像我想找到学习科目、物理和生理学的学生如果我删除了引用的 ERROR: column "subject_studying" does not exist LINE 15: AND ArrayLike(subject_studying, 'physi') = 1
  • ANY 不适用于模式匹配运算符(如果 OP 想要针对单个模式测试多个值;反之(测试多个模式的单个值)可以与 @987654326 一起使用@)。
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
相关资源
最近更新 更多