如何在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语句并获取结果集吗?
答案 0 :(得分:1)
您无法从DO
语句返回值。改为创建一个plpgsql函数。
有几种方法可以使用RETURNING
子句或OUT
参数定义返回类型。阅读有关CREATE FUNCTION
。
有几种方法可以从函数中返回值。请阅读手册中的Returning From a 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。我发布了many related code examples。
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;
Temporary tables are dropped automatically at the end of the session.
答案 1 :(得分:0)
最后我做了IT - 在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');
这很完美。任何有关如何更好地处理我的工作的建议将受到高度赞赏。感谢