Postgresql 初始化存储函数中的字符串

Postgresql 初始化存储函数中的字符串,postgresql,stored-procedures,Postgresql,Stored Procedures,我将此过程称为无任何问题: SELECT SP_getGlobalVariable('current_user_id')::INT ; 如果我在另一个存储过程中调用它,如下所示: -- Get current User Id -- SELECT SP_getGlobalVariable('current_user_id')::INT INTO __currentUserId ; 我有一个错误: ERROR : Syntax error near "current_user_id" LINE

我将此过程称为无任何问题:

SELECT SP_getGlobalVariable('current_user_id')::INT ;
如果我在另一个存储过程中调用它,如下所示:

-- Get current User Id --
SELECT SP_getGlobalVariable('current_user_id')::INT INTO __currentUserId ;
我有一个错误:

ERROR : Syntax error near "current_user_id"
LINE 25:   SELECT SP_getGlobalVariable('current_user_id')::INT INTO _...
这可能是一个愚蠢的语法错误。。。如果有人能帮助一个可怜的MySQL用户开始使用PG

编辑1:

SELECT version();
PostgreSQL 9.3.3 on i686-pc-linux-gnu, compiled by gcc-4.4.real (Debian 4.4.5-8) 4.4.5, 32-bit
这是version()调用的结果

在临时表中获取全局变量的过程*

编辑2:

CREATE OR REPLACE FUNCTION SP_insertSite (__siteName VARCHAR(70), __siteDescription  TEXT, __siteLatitude NUMERIC, __siteLongitude NUMERIC)
RETURNS INT
AS
' 
DECLARE

-- Variables
__right_edge_father INT ;
__left_edge_father INT ;
__depth_father INT ;
__nbrSites INT ;
__insertId INT ;
__currentUserId INT ;

BEGIN

    -- Check if tree is empty --
    SELECT COUNT(*) INTO __nbrSites
    FROM site ;

    -- Get current User Id --
    SELECT SP_getGlobalVariable('current_user_id')::INT INTO __currentUserId ;

    IF __nbrSites = 0 THEN

        INSERT INTO site (site_name, site_description, site_latitude, site_longitude, site_left_edge, site_right_edge, site_depth, site_create_dt, site_create_user_id)
        VALUES(__siteName, __siteDescription, 0.0, 0.0, 1, 2, 0, LOCALTIMESTAMP, __currentUserId)
        RETURNING site_id INTO __insertId;

    ELSE

        -- Get father edges --
        SELECT site_left_edge, site_right_edge, site_depth
        INTO __left_edge_father, __right_edge_father, __depth_father
        FROM site
        WHERE site_id = (SELECT site_id FROM site WHERE site_depth = 0 LIMIT 1) ;

        -- Updates left edges --
        UPDATE site
        SET site_left_edge = site_left_edge + 2
        WHERE site_left_edge >= __right_edge_father ;

        -- Updates right edges --
        UPDATE site
        SET site_right_edge = site_right_edge + 2
        WHERE site_right_edge >= __right_edge_father ;

        -- Insert new node --
        INSERT INTO site (site_name, site_description, site_latitude, site_longitude, site_left_edge, site_right_edge, site_depth, site_create_dt, site_create_user_id)
        VALUES(__siteName, __siteDescription, __siteLatitude, __siteLongitude, __right_edge_father, __right_edge_father+1, __depth_father+1, LOCALTIMESTAMP, __currentUserId)
        RETURNING site_id INTO __insertId;

    END IF ;

    RETURN __insertId ;

END ;
'
LANGUAGE plpgsql;

问题在于,您使用单引号来封装函数体,因此,当您尝试在函数体中添加单引号时,需要对其进行转义,例如:

CREATE OR REPLACE FUNCTION SP_insertSite (...)
RETURNS INT
AS
' 
DECLARE
...
    -- Get current User Id --
    SELECT SP_getGlobalVariable(''current_user_id'')::INT INTO __currentUserId ;
...
    RETURN __insertId ;

END ;
'
LANGUAGE plpgsql;
那很好。但我建议您使用,这样您就不必担心函数体内部的单引号转义,如下所示:

CREATE OR REPLACE FUNCTION SP_insertSite (...)
RETURNS INT
AS
$$
DECLARE
...
    -- Get current User Id --
    SELECT SP_getGlobalVariable('current_user_id')::INT INTO __currentUserId ;
...
    RETURN __insertId ;

END ;
$$
LANGUAGE plpgsql;

我建议您阅读(整个文档,不仅仅是这一小节也很有趣)。

这是什么PostgreSQL版本?程序是用什么语言编写的?(如果可能,显示
SELECT version()
的完整过程定义和输出)。完成后,请在此处编辑您的问题和评论。但是:不要将语言名称放在单引号中。这是一个标识符,不是字符串常量。谢谢。但是,您还没有实际显示出现错误的过程。你已经展示了你正在呼叫的那个,有效的那个。我有解决方案。。。问题在于为过程主体选择了愚蠢的分隔符!谢谢马修斯,我已经看到了(第一篇文章的最后一条评论)。@GuilhemG.,对不起,我好像没有看到。无论如何,我认为给这个话题留下一个合适的解决方案是很好的
CREATE OR REPLACE FUNCTION SP_insertSite (...)
RETURNS INT
AS
$$
DECLARE
...
    -- Get current User Id --
    SELECT SP_getGlobalVariable('current_user_id')::INT INTO __currentUserId ;
...
    RETURN __insertId ;

END ;
$$
LANGUAGE plpgsql;