pgsql函数无法执行

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

我尝试执行这个函数:

CREATE OR REPLACE FUNCTION public.increases_chrono(
    chrono_seq_name text,
    chrono_id_name text)
    RETURNS TABLE(chrono_id bigint) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 1000

AS $$
DECLARE
    retval bigint;
BEGIN
    -- Check if sequence exist, if not create
    IF NOT EXISTS (SELECT 0 FROM pg_class where relname = chrono_seq_name ) THEN
      EXECUTE 'CREATE SEQUENCE "' || chrono_seq_name || '" INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1;';
    END IF;
    -- Check if chrono exist in parameters table, if not create
    IF NOT EXISTS (SELECT 0 FROM parameters where id = chrono_id_name ) THEN
      EXECUTE 'INSERT INTO parameters (id, param_value_int) VALUES ( ''' || chrono_id_name || ''', 1)';
    END IF;
    -- Get next value of sequence, update the value in parameters table before returning the value
    SELECT nextval(chrono_seq_name) INTO retval;
      UPDATE parameters set param_value_int = retval WHERE id =  chrono_id_name;
      RETURN QUERY SELECT retval;
END;
$$;

ALTER FUNCTION public.increases_chrono(text, text)
    OWNER TO maarch;

但是当我像这样命令他时:

SELECT increases_chrono('chrono_DAP_2023_seq' ,'chrono_DAP_2023')

我有错误:错误:关系“chrono_dap_2023_seq”不存在 上下文:SQL 语句“SELECT nextval(chrono_seq_name)” PL/pgSQL函数increase_chrono(text,text)第14行在SQL语句

SQL状态:42P01 有人可以帮助我吗

plpgsql pgadmin
1个回答
0
投票

存在区分大小写的问题。

CREATE
看起来像

CREATE SEQUENCE "chrono_DAP_2023_seq" 
   INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1;

标识符位于双引号内 - 因此区分大小写。

但是当您尝试使用它时,变量

chrono_seq_name
不会在双引号内传递,因此它不是区分大小写的标识符。使用
quote_ident
功能修复它:

-- Get next value of sequence, update the value in parameters 
---table before returning the value
SELECT nextval(quote_ident(chrono_seq_name)) INTO retval;
© www.soinside.com 2019 - 2024. All rights reserved.