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;