我不确定如何实现以下内容:
CREATE OR REPLACE FUNCTION fnJobQueueBEFORE() RETURNS trigger AS $$
DECLARE
shadowname varchar := TG_TABLE_NAME || 'shadow';
BEGIN
INSERT INTO shadowname VALUES(OLD.*);
RETURN OLD;
END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
即将值插入到具有动态生成名称的表中.
执行上面的代码会产生:
ERROR: relation "shadowname" does not exist
LINE 1: INSERT INTO shadowname VALUES(OLD.*)
Run Code Online (Sandbox Code Playgroud)
它似乎表明变量不会作为表名扩展/允许.我在Postgres手册中没有发现这个.
我已经尝试过EXECUTE
这样的事情:
EXECUTE 'INSERT INTO ' || quote_ident(shadowname) || ' VALUES ' || OLD.*;
Run Code Online (Sandbox Code Playgroud)
但没有运气:
ERROR: syntax error at or near ","
LINE 1: INSERT INTO personenshadow VALUES (1,sven,,,)
Run Code Online (Sandbox Code Playgroud)
该RECORD
类型似乎失去了:OLD.*
似乎被转换为字符串,并得到的重新解析,导致各种各样的类型的问题(例如NULL
值). …
像这样的东西:
CREATE OR REPLACE FUNCTION get(param_id integer)
RETURNS integer AS
$BODY$
BEGIN
SELECT col1 FROM TABLE WHERE id = param_id;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我想避免DECLARE
这样做.
我在存储过程中有一个查询,它在表中汇总了一些值:
SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res;
Run Code Online (Sandbox Code Playgroud)
在此选择之后,我res
用另一个查询检索的整数减去值并返回结果.如果WHERE
条款得到验证,一切正常.但如果不是,我的所有函数返回都是一个空列(可能因为我试图减去一个空值的整数).
如果WHERE
不满足该条款,如何使我的查询返回零?
我的要求是给函数写可选参数.参数是可选的,有时我会添加或我不会传递参数到函数.任何人都可以帮我如何编写函数.
我写得像
select *
from test
where field3 in ('value1','value2')
and ($1 is null or field1 = $1)
and ($2 is null or field2 = $2)
and ($3 is null or field3 = $3);
Run Code Online (Sandbox Code Playgroud)
我将参数传递给Query,但我的输出不是预期的.当我传递所有三个参数时,我的输出是正确的,否则它不是预期的输出.
我想用来SELECT INTO
在我的一个函数中创建一个临时表.SELECT INTO
适用于SQL但不适用于PL/pgSQL.
此语句创建一个名为mytable的表(如果orig_table
作为关系存在):
SELECT *
INTO TEMP TABLE mytable
FROM orig_table;
Run Code Online (Sandbox Code Playgroud)
但是把这个函数放到PostgreSQL中,你得到错误: ERROR: "temp" is not a known variable
CREATE OR REPLACE FUNCTION whatever()
RETURNS void AS $$
BEGIN
SELECT *
INTO TEMP TABLE mytable
FROM orig_table;
END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我可以在PL/pgSQL SELECT INTO
中输入类型的变量record
,但是当从该记录中获取数据时我必须定义结构.SELECT INTO
非常简单 - 自动创建一个与SELECT
查询结构相同的表.有没有人解释为什么这在函数内部不起作用?
它似乎SELECT INTO
在PL/pgSQL中的工作方式不同,因为您可以选择已声明的变量.不过,我不想声明我的临时表结构.我希望它能像在SQL中一样自动创建结构.
我有一个geofences
存储geometry
多边形的表.
我还有一个A
在几何体内部的点.我要做的是找到A
位于多边形几何体表面上的点的两个最近点.
PostGIS中的功能:
CREATE OR REPLACE FUNCTION accuracyCheck(Polygon geometry
,decimal lat
,decimal lon)
RETURNS VARCHAR AS
$BODY$
DECLARE height DECIMAL;
DECLARE accuracy VARCHAR(250);
BEGIN
CREATE TEMPORARY TABLE closePointStorage AS
SELECT ST_AsText(ST_ClosestPoint(geometry
,ST_GeomFromText('POINT(lat lon)',0)
)
) AS closestPoint
FROM (
SELECT ST_GeomFromText(geometry) as geometry
FROM gfe_geofences
WHERE is_active=true
) As tempName;
CREATE TEMPORARY TABLE areaStorage ON COMMIT DROP AS
SELECT ST_Area(ST_GeomFromText('Polygon((23.0808622876029 96.1304006624291
,28.0808622876029 99.1304006624291
,100 200
,23.0808622876029 96.1304006624291
))'
,0)
) AS area; …
Run Code Online (Sandbox Code Playgroud) 我正在寻求澄清如何在plpgsql函数中确保原子事务,以及为数据库的这个特定更改设置隔离级别.
在下面显示的plpgsql函数中,我想确保删除和插入成功.当我尝试将它们包装在一个事务中时,我收到一个错误:
ERROR: cannot begin/end transactions in PL/pgSQL
.
如果另一个用户在此功能删除了自定义行之后但在有机会插入自定义行之前添加了环境的默认行为('RAIN','NIGHT','45MPH'),则执行下面的函数时会发生什么?行?是否存在包含插入和删除的隐式事务,以便在另一个用户更改此函数引用的任一行时回滚它们?我可以为此功能设置隔离级别吗?
create function foo(v_weather varchar(10), v_timeofday varchar(10), v_speed varchar(10),
v_behavior varchar(10))
returns setof CUSTOMBEHAVIOR
as $body$
begin
-- run-time error if either of these lines is un-commented
-- start transaction ISOLATION LEVEL READ COMMITTED;
-- or, alternatively, set transaction ISOLATION LEVEL READ COMMITTED;
delete from CUSTOMBEHAVIOR
where weather = 'RAIN' and timeofday = 'NIGHT' and speed= '45MPH' ;
-- if there is no default behavior …
Run Code Online (Sandbox Code Playgroud) transactions runtime-error plpgsql read-committed postgresql-9.2
我一直在寻找网络,试图找到学习PostgreSQL的过程编程语言PL/pgSQL的良好资源.
到目前为止,我唯一能够设法挖掘的是PostgreSQL文档中的教程.虽然这很好,但我一直在寻找更深入的东西.你能推荐一下吗?
我正在尝试用可选参数编写PL/pgSQL函数.它基于过滤的记录集(如果指定)执行查询,否则对表中的整个数据集执行查询.
例如(PSEUDO CODE):
CREATE OR REPLACE FUNCTION foofunc(param1 integer, param2 date, param2 date, optional_list_of_ids=[]) RETURNS SETOF RECORD AS $$
IF len(optional_list_of_ids) > 0 THEN
RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2 AND id in optional_list_of_ids);
ELSE
RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2);
ENDIF
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
实现此功能的正确方法是什么?
顺便说一句,我想知道如何在另一个外部函数中调用这样的函数.我就是这样做的 - 它是正确的,还是有更好的方法?
CREATE FUNCTION foofuncwrapper(param1 integer, param2 date, param2 date) RETURNS SETOF RECORD AS $$
BEGIN
CREATE TABLE ids AS SELECT id from …
Run Code Online (Sandbox Code Playgroud) postgresql parameters stored-procedures plpgsql parameter-passing
我正在尝试创建一个返回SELECTed结果集的函数.当我像这样调用我的postgres函数时,select * from tst_dates_func()
我得到一个错误,如下所示:
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 "tst_dates_func" line 3 at SQL statement
********** Error **********
ERROR: query has no destination for result data
SQL state: 42601
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Context: PL/pgSQL function "tst_dates_func" line 3 at SQL statement
Run Code Online (Sandbox Code Playgroud)
这是我创建的函数:
CREATE OR REPLACE FUNCTION tst_dates_func() …
Run Code Online (Sandbox Code Playgroud) plpgsql ×10
postgresql ×9
sql ×4
parameters ×2
coalesce ×1
dynamic-sql ×1
function ×1
null ×1
postgis ×1
transactions ×1
triggers ×1
variables ×1