【发布时间】:2012-11-23 15:46:53
【问题描述】:
有问题的代码:
CREATE OR REPLACE FUNCTION foo(searchid INTEGER)
RETURNS INTEGER AS
$$
DECLARE
level INTEGER := 0;
mid INTEGER := searchid;
BEGIN
WHILE EXISTS(SELECT id INTO mid FROM tbl1 WHERE parent_id=mid) LOOP
level := level + 1;
END LOOP;
RETURN level;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
我需要找到 id 为 searchid 的元素的树深度,我编写了一个与上面略有不同的函数,它使用 mid NOTNULL 作为 while 循环的条件,它可以工作。
但是,当我尝试在 WHILE 条件下直接使用EXISTS 如上面发布的代码 时,postgresql 会说:
SQL error:
ERROR: syntax error at or near "$1"
LINE 1: SELECT EXISTS(SELECT id INTO $1 FROM tbl1 WHERE ...
所以它对我的代码做了一些奇怪的转换,导致它在语法上是错误的。
如何解决?
它在 postgresql 8.3.17 上运行。
【问题讨论】:
-
表达式是
mid NOTNULL还是mid NOT NULL?空间很重要。 -
@GordonLinoff 没有空格。
-
。 .如果您添加空格,我认为这可能会解决您的问题。
-
@GordonLinoff 在哪里添加空间?带有
EXISTS的代码不包含NOTNULL。 -
您忘记提及您的 PostgreSQL 版本。对于程序员来说,这是不言而喻的。最佳解决方案取决于您的版本。
标签: sql postgresql plpgsql