首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres中的动态SQL

Postgres中的动态SQL
EN

Stack Overflow用户
提问于 2014-04-04 14:48:10
回答 2查看 475关注 0票数 2

我使用Postgres编写了一个简单的函数,但始终得到以下内容:

错误:语法错误在或接近"$2“。

底层数据库是ParAccel,我对Postgres和ParAccel都很陌生。我使用蟾蜍数据点作为IDE:

代码语言:javascript
复制
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$

我使用下面的示例命令来执行函数:

代码语言:javascript
复制
{CALL GET_NEXT_SURR_KEY('some_schema_name','some_table_name','some_column_name','P')};

有人能告诉我我在哪里搞砸了吗?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-13 12:32:53

ParAccel有标识字段的概念,不确定为什么不使用它们。

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

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

代码语言:javascript
复制
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$
票数 0
EN

Stack Overflow用户

发布于 2014-04-11 22:58:21

相信马,使用序列-因为您在OLAP环境中,您很可能不会得到唯一性违规,但如果这将是一个正常的网站,您将得到相同的id非常经常两次。至于您的函数,它在我的数据库中的一个随机表上进行了很好的测试,并且没有给出错误,所以查找蟾蜍的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22866002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档