我需要创建一个函数来运行查询并返回结果,其中包含表名和列名作为赋予函数的arugments.我目前有这个:
CREATE OR REPLACE FUNCTION qa_scf(tname character varying, cname character varying)
RETURNS SETOF INT AS
$BODY$
BEGIN
RETURN QUERY SELECT * FROM tname WHERE cname !='AK' AND cname!='CK';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
Run Code Online (Sandbox Code Playgroud)
这给了我运行时错误"关系'tname'不存在".我是Postgres的新功能,所以任何帮助都表示赞赏.我觉得返回int是错误的,但我不知道还有什么可以让它返回返回行的所有列.谢谢!
我在postgres中编写存储过程,我需要检查是否存在行,然后相应地执行操作.沿线的东西.
IF SELECT * FROM foo WHERE x = 'abc' AND y = 'xyz' THEN
-- do something here
ELSE
-- do something else
END;
Run Code Online (Sandbox Code Playgroud)
我谷歌搜索了一下,但没有得到很好的点击.
我正在尝试使用游标来连接多个表的查询.我已经看到oracle有一个基于游标的记录.当我为Postgres尝试相同时,它会抛出一些错误.我怎么能在Postgres做同样的事情?
CREATE OR REPLACE FUNCTION avoidable_states()
RETURNS SETOF varchar AS
$BODY$
DECLARE
xyz CURSOR FOR select * from address ad
join city ct on ad.city_id = ct.city_id;
xyz_row RECORD;
BEGIN
open xyz;
LOOP
fetch xyz into xyz_row;
exit when xyz_row = null;
if xyz_row.city like '%hi%' then
return next xyz_row.city;
end if;
END LOOP;
close xyz;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Run Code Online (Sandbox Code Playgroud)ERROR: relation "xyz" does not exist CONTEXT: compilation of PL/pgSQL function "avoidable_states" near line 4
我需要创建一个函数,检查给定的表是否infowindow存在该字段.如果它存在,则函数必须返回select * from table但如果不存在,则必须返回一个附加id字段:
CREATE OR REPLACE FUNCTION getxo_ocx_cincu_preparar_infowindow(
guretabla character varying)
RETURNS TABLE AS
$BODY$
DECLARE
tabla ALIAS FOR $1;
BEGIN
IF EXISTS (SELECT 1
FROM pg_namespace n
JOIN pg_class c ON c.relnamespace = n.oid
JOIN pg_attribute a ON a.attrelid = c.oid
WHERE n.nspname = current_schema() -- default to current schema
AND c.relname = tabla
AND a.attname = 'infowindow'
AND NOT a.attisdropped)
THEN
RETURN QUERY EXECUTE 'SELECT * from ' ||tabla ;
ELSE …Run Code Online (Sandbox Code Playgroud) 我有一个表"UserState",其中包含以下字段:id,userid,ctime,state,endtime.我有一个简单的查询:
SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp
Run Code Online (Sandbox Code Playgroud)
我有一个plpgsql函数,它必须将此查询的结果作为参数:
get_timeinstate(SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp);
Run Code Online (Sandbox Code Playgroud)
如何正确创建函数以将查询结果作为参数传递给那里?有必要理解,该函数返回另一个SQL结果,我需要在那里使用"IN"条件:
$func$
BEGIN
RETURN QUERY
SELECT
...myanotherquery...
WHERE "UserState".userid IN (HERE I NEED TO INSERT MY QUERY RESULT)
END;
$func$
Run Code Online (Sandbox Code Playgroud) 如何在postgres中编写一个不返回值的简单存储过程?当我调用存储过程时,即使使用void返回类型,我也会返回一行.
CREATE FUNCTION somefunc(in_id bigint) RETURNS void AS $$
BEGIN
DELETE from test_table where id = in_id;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud) 这是我理想的想法.想象一下,我有一个A行的表.
我想要做:
SELECT A, func(A) FROM table
Run Code Online (Sandbox Code Playgroud)
并为输出说4列.
有没有办法做到这一点?我已经看到了自定义类型或任何可以让你得到一个看起来像的结果的东西
A B C D)
但是,如果我能让一个函数返回多个列而不再进行重新分析,那将会非常棒.
有没有什么可以做这样的事情?
我AFTER UPDATE在表上有一个延迟触发器,设置为在某个列更新时触发.这是我用作计数器的整数类型.
我不是100%肯定,但看起来如果我在事务期间将该特定列增加100次,则触发器在事务结束时排队并执行100次.
我希望触发器每行只安排一次,无论我增加了多少次该列.
我能以某种方式这样做吗?或者,如果触发的触发器必须排队,无论它们是否重复,我是否可以在首次运行触发器时清除此队列?
Postgres的版本是9.1.这是我得到的:
CREATE CONSTRAINT TRIGGER counter_change
AFTER UPDATE OF "Counter" ON "table"
DEFERRABLE INITIALLY DEFERRED
FOR EACH ROW
EXECUTE PROCEDURE counter_change();
CREATE OR REPLACE FUNCTION counter_change()
RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
BEGIN
PERFORM some_expensive_procedure(NEW."id");
RETURN NEW;
END;$$;
Run Code Online (Sandbox Code Playgroud) 这里和这里已经多次询问过,但是在我的情况下没有一个答案是合适的,因为我不想在PL/PgSQL函数中执行我的更新语句并使用GET DIAGNOSTICS integer_var = ROW_COUNT.
我必须在原始SQL中执行此操作.
例如,在MS SQL SERVER中,我们有@@ ROWCOUNT,可以使用如下所示:
UPDATE <target_table>
SET Proprerty0 = Value0
WHERE <predicate>;
SELECT <computed_value_columns>
FROM <target>
WHERE @@ROWCOUNT > 0;
Run Code Online (Sandbox Code Playgroud)
在数据库的一次往返中,我知道更新是否成功并返回计算值.
什么可以用来代替'@@ ROWCOUNT'?有人可以确认此时这实际上是不可能的吗?
提前致谢.
编辑1:我确认我需要使用原始SQL(我在原始描述中写了"raw plpgsql").
为了使我的问题更清楚,请考虑更新语句只影响一行并考虑乐观并发:
客户首先做了一份SELECT声明.
他构建了UPDATE并知道哪些数据库计算列将包含在SELECT子句中.除其他外,谓词包括每次更新行时计算的时间戳.
所以,如果我们返回1行,那么一切都OK.如果没有返回行,那么我们知道先前有更新,并且客户端可能需要在再次尝试更新子句之前刷新数据.这就是为什么我们需要知道在返回计算列之前受update语句影响的行数.如果更新失败,则不应返回任何行.
有没有办法在postgres中比较软件版本(例如XYZ> ABC)?我正在搜索string/varchar或"version"类型的函数.
我发现了http://pgxn.org/dist/semver/doc/semver.html,但我正在寻找替代方案(不是那么容易部署..)
非常感谢.
plpgsql ×10
postgresql ×10
cursor ×1
dynamic-sql ×1
exists ×1
loops ×1
polymorphism ×1
return-type ×1
sql ×1
sql-function ×1
triggers ×1
version ×1
version-sort ×1