【问题标题】:Call an Array result from select function to do update function with postgresql从选择函数调用数组结果以使用 postgresql 执行更新函数
【发布时间】:2021-09-27 16:35:38
【问题描述】:

我是 SQL 函数和 postgreSQL 的新手。我只是尝试选择我的 compte 表中的一些邮件以在之后更新它们,所以我创建了选择和更新函数,但我总是出现错误:

“错误:查询“SELECT emailAnonymisation()”返回多行 上下文:语句块局部变量初始化期间的 PL/pgSQL 函数 updateMail() 第 5 行"

问题出在我的更新函数中,但不知道是变量问题还是函数逻辑问题...

我的选择功能


CREATE OR REPLACE FUNCTION emailAnonymisation() 
RETURNS table (mail varchar)
LANGUAGE plpgsql 
AS $$
BEGIN
    return query
SELECT compte.mail
  FROM compte
  limit 100;
END 
$$; 

我调用 emailAnonymisation() 函数的更新函数以及我认为问题出在哪里

CREATE OR REPLACE FUNCTION updateMail()
  RETURNS varchar[] AS
$BODY$
DECLARE
    _tbl varchar[]:=emailAnonymisation();
    t    text;
BEGIN

FOREACH t IN ARRAY _tbl
LOOP
    EXECUTE '
    UPDATE ' || t || '
    SET t = REPLACE(SUBSTR(t,LOCATE('@',t) + 1),"X")
    WHERE LOCATE('@',t) > 0;';
END LOOP;

END;
$BODY$ LANGUAGE plpgsql; 

更新调用

select updateMail();

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    尝试使用 SETOF:

    CREATE OR REPLACE FUNCTION emailAnonymisation() 
    RETURNS SETOF string(mail varchar)
    LANGUAGE plpgsql 
    AS $$
    BEGIN
        return query
    SELECT compte.mail
      FROM compte
      limit 100;
    END 
    $$;
    

    【讨论】:

      【解决方案2】:

      好的,我终于找到了选择的问题,我应该有一个这样的返回,带有 RETURNS 字符变化 []

      CREATE OR REPLACE FUNCTION emailAnonymisation() 
      RETURNS character varying[]
      AS $$
      DECLARE 
          result character varying[];
      BEGIN
      SELECT ARRAY( SELECT compte.mail as mail
        FROM compte
        WHERE mail IS NOT NULL         
        limit 100)
        into result;
        return result;
      END;
      $$
      LANGUAGE plpgsql;
      

      对于更新和选择函数的类型相同

      CREATE OR REPLACE FUNCTION updateMail()
        RETURNS character varying(150) AS
      $BODY$
      DECLARE
          _tbl character varying[]:=emailAnonymisation();
          mail    text;
          endUrl text := '@mail.com';
          BeginningUrl text := random_string(15);
      BEGIN
      FOREACH mail IN ARRAY _tbl
      LOOP
          UPDATE ' || t || '
          SET t = REPLACE(SUBSTR(t,LOCATE('@',t) + 1),"X")
          WHERE LOCATE('@',t) > 0;';
      END LOOP;
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-20
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        相关资源
        最近更新 更多