我已经用Postgres编写了一个简单的函数,但仍然会得到以下结果:
错误:在“$2”处或附近出现语法错误。
底层数据库是ParAccel,我对Postgres和ParAccel都不熟悉。我使用蟾蜍数据点作为IDE:

CREATE OR REPLACE FUNCTION GET_NEXT_SURR_KEY(I_SCHEMA_NM VARCHAR, I_TABLE_NM VARCHAR,I_COLUMN_NM VARCHAR,I_POSNEG_FLAG VARCHAR)
RETURNS BIGINT
LANGUAGE PLPGSQL
AS $body$
DECLARE
    O_RET_VALUE BIGINT := 0;
    V_DYN_SQL VARCHAR(2000) := '';
BEGIN
    IF I_POSNEG_FLAG = 'P' THEN
       V_DYN_SQL := 'SELECT MAX(' || I_COLUMN_NM || ') + 1 FROM ' || I_SCHEMA_NM || '.' || I_TABLE_NM;

    ELSE
       V_DYN_SQL := 'SELECT MIN(' || I_COLUMN_NM || ') - 1 FROM ' || I_SCHEMA_NM || '.' || I_TABLE_NM;
    END IF;

    EXECUTE V_DYN_SQL INTO O_RET_VALUE;

    RETURN O_RET_VALUE;
END $body$

我使用以下示例命令来执行该函数:
{CALL GET_NEXT_SURR_KEY('some_schema_name','some_table_name','some_column_name','P')};

有谁能告诉我我在哪里搞砸了吗?
提前谢谢。

最佳答案

ParAccel有标识字段的概念,不知道为什么不使用它们。
但无论如何,这里是如何解决你的问题。
顺便说一句,我相信你写的代码可以在PostgreSQL 9或更高版本上运行,但是ParAccel使用的是7.02版本(如果我没搞错的话),它不支持SELECT INTO变量,所以你需要用一个记录捕获结果,并使用循环提取值(我没有重写你所有的函数,只是主要部分)

CREATE OR REPLACE FUNCTION GET_NEXT_SURR_KEY(I_SCHEMA_NM VARCHAR, I_TABLE_NM VARCHAR,I_COLUMN_NM VARCHAR,I_POSNEG_FLAG VARCHAR)
RETURNS BIGINT
LANGUAGE PLPGSQL
AS $body$
DECLARE
    O_RET_VALUE BIGINT default 0;
    V_DYN_SQL VARCHAR(2000) := '';
    _ret_rec record;
BEGIN


     V_DYN_SQL := 'SELECT MAX(' || I_COLUMN_NM || ') + 1 as new_id FROM ' || I_SCHEMA_NM || '.' || I_TABLE_NM;

    FOR _ret_rec IN EXECUTE V_DYN_SQL
    LOOP
        O_RET_VALUE := _ret_rec.new_id;
    END LOOP;


    RETURN O_RET_VALUE;
END $body$

09-08 03:48