1

如何在 plpgsql 的 IF 条件内运行 SQL 语句?我不想创建或替换函数。这是我尝试过的:

DO LANGUAGE plpgsql $$
BEGIN
IF 'Khosla' = 'Khosla' THEN
SELECT * FROM test_log limit 10;
ELSE
RAISE NOTICE 'not worked';
END IF;
END;
$$;

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function "inline_code_block" line 3 at SQL statement

我也试过了,但无法获取数据:

DO LANGUAGE plpgsql $$
BEGIN
if 'a' = 'a' THEN
PERFORM * FROM test_log limit 10;
else
raise notice 'not worked';
end if;
end;
$$;

Output: Query returned successfully with no result in 13 ms.

正确阅读文档后,我知道 PERFORM 执行 SQL 并丢弃结果集。

您能帮忙运行 SQL 语句并获取结果集吗?

4

2 回答 2

1

不能DO语句中返回值。而是创建一个 plpgsql 函数。

有几种方法可以使用RETURNING子句或OUT参数来定义返回类型。阅读有关CREATE FUNCTION.

有几种方法可以从函数返回值。阅读手册中的从函数返回一章。

特别是,由于您试图从表中返回整行,因此可以将表的注册类型用于函数声明:

CREATE FUNCTION foo ()
  RETURNING SETOF test_log 
$func$
BEGIN

IF 'a' = 'a' THEN
  RETURN QUERY
  SELECT * FROM test_log LIMIT 10;
ELSE
   RAISE WARNING $$Didn't work!$$;
END IF;

END
$func$ LANGUAGE plpgsql;

称呼:

SELECT * FROM foo ();

或者尝试在 SO 上搜索。我发布了许多相关的代码示例

DO语句的解决方法

如果您不能使用函数,则使用 DO 语句的唯一中途明智的解决方法是使用临时表:

CREATE TEMP TABLE tbl_tmp AS
SELECT * FROM test_log LIMIT 0;

$do$
BEGIN

IF 'a' = 'a' THEN
  INSERT INTO tbl_tmp
  SELECT * FROM test_log LIMIT 10;
ELSE
   RAISE WARNING $$Didn't work!$$;
END IF;

END
$do$ LANGUAGE plpgsql;

SELECT * FROM tbl_tmp;

临时表会在会话结束时自动删除。

于 2013-10-01T19:58:00.080 回答
0

最后我做到了——在 plpgsql 函数中传递参数。

CREATE OR REPLACE FUNCTION param_test_1(text)
RETURNS TABLE (comp_id int, comp_name text, comp_sort text) AS $$
BEGIN
IF 'company' = $1 THEN
RETURN QUERY SELECT id::int as comp_id, ltrim(company.compname)::text as compname, ltrim(company.compname)::text as sort FROM company where deleteflag = '0' and active = '1' and id in (270,394,376,396,403);
ELSEIF 'jobs' = $1 THEN
RAISE NOTICE 'Not Working';
END IF;
RETURN;
END;
$$ LANGUAGE plpgsql;

SELECT * FROM param_test_1('company');

这是完美的工作。任何有关我工作的更好方法的建议都将受到高度赞赏。谢谢

于 2013-10-03T14:12:27.697 回答