pgsql concat for number 返回 null

pgsql concat for number returning null

我创建了如下序列:

     CREATE SEQUENCE public.shiwangini_seq
     INCREMENT BY 1
     MINVALUE 1
     MAXVALUE 9223372036854775807
     START 150037
     CACHE 1
     NO CYCLE;

在此之后 - 我创建了一个将使用此序列生成下一个值的函数:

  create or replace function shiwangini_unq(out v_final_value2 bigint) as $$
  declare 
  v_seq_value bigint;
  v_shard_id bigint;
  v_final_value2 bigint ;
  begin 
  select nextval('shiwangini_seq') into v_seq_value ;
  v_shard_id := 2;
  select concat (v_seq_value , v_shard_id ) into v_final_value2 ;
  end ;
  $$ language plpgsql ;

现在,这个函数 returns 每当我调用它时都会为 null。如下图:

    select shiwangini_unq();  ----null

我检查过 concat() 本身管理类型转换。即使在那之后,在我的例子中它也返回 null。我真的很感激能帮助它工作。提前致谢!

您将函数的 return 类型作为输入,这就是问题所在。如果有任何错误,下面的代码对我来说效果很好,请给我发短信。 试试这个

create or replace function shiwangini_unq() returns bigint as $$
  declare 
  v_seq_value bigint;
  v_shard_id bigint;
  v_final_value2 bigint ;
  begin 
  select nextval('shiwangini_seq') into v_seq_value ;
  v_shard_id := 2;
  select concat (v_seq_value, v_shard_id ) into v_final_value2 ;
 return v_final_value2;
  end ;
  $$ language plpgsql ;

您的主要问题是,变量 v_final_value2 掩盖了您的输出参数。

但这并不是开始所需要的。

您应该声明一个正确的 return 类型。但是你在这里把事情复杂化了。您可以在没有 PL/pgSQL 和简单的 SQL 函数的情况下提高效率:

create or replace function shiwangini_unq() 
  return bigint 
as $$
  select concat(nextval('shiwangini_seq'), 2)::bigint;
$$ language sql;

您可以将其编写为正常的 SQL 函数(不带 OUT 参数)并消除所有数据对话。

create or replace 
function shiwangini_unq() 
  returns bigint 
 language sql
as $$
   select 10*nextval('shiwangini_seq')+2;
$$;  

或者完全删除该功能。

create sequence shiwangini_seqX start with 12 increment by 10;

demo