2

我使用 Postgres 编写了一个简单的函数,但不断得到以下信息:

错误:“$2”处或附近的语法错误。

底层数据库是 ParAccel,我对 Postgres 和 ParAccel 都是新手。我使用 TOAD 数据点作为 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')};

谁能让我知道我在哪里搞砸了?

提前致谢。

4

2 回答 2

0

相信马,使用序列 - 因为您在 OLAP 环境中,您很可能不会违反唯一性,但如果这是一个正常的网站,您会经常两次获得相同的 id。至于您的功能,它工作得非常好 - 在我的数据库中的随机表上对其进行了测试,并且没有给出错误,因此请在 TOAD 中查找故障。

于 2014-04-11T22:58:21.370 回答
0

ParAccel 有 IDENTITY 字段的概念,不知道你为什么不使用它们。

但无论如何,这里是如何解决你的问题。

顺便说一句,我相信您编写的代码可以在 PostgreSQL 9 或更高版本上运行,但是 ParAccel 使用的是不支持 SELECT INTO 变量的版本 7.02(如果我没记错的话),因此您需要使用记录来捕获结果和使用循环提取值(我没有重写你的所有函数,只是主要部分)

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$
于 2014-05-13T12:32:53.833 回答