我使用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')};有人能告诉我我在哪里搞砸了吗?
提前谢谢。
发布于 2014-05-13 12:32:53
ParAccel有标识字段的概念,不确定为什么不使用它们。
但无论如何,这里是如何解决你的问题。
顺便说一句,我相信您编写的代码将在PostgreSQL 9或更高版本上运行,但是ParAccel使用的是7.02版本(如果我没有弄错的话),它不支持将SELECT放入变量中,因此您需要用一个记录来捕获结果并使用一个循环提取值(我没有重写所有函数,只是主要部分)
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-04-11 22:58:21
相信马,使用序列-因为您在OLAP环境中,您很可能不会得到唯一性违规,但如果这将是一个正常的网站,您将得到相同的id非常经常两次。至于您的函数,它在我的数据库中的一个随机表上进行了很好的测试,并且没有给出错误,所以查找蟾蜍的错误。
https://stackoverflow.com/questions/22866002
复制相似问题