如何找到已加载到EnterpriseDB中的语言(PL/pgsql,SPL,Java)?如果有人知道在PostgreSQL上找到加载语言的方法,那么EnterpriseDB建立在PostgreSQL之上.它应该工作相同.
我甚至不确定这叫什么?
但我正在尝试学习写这样的函数在plpgsql中的区别:
CREATE OR REPLACE FUNCTION foo() RETURNS TRIGGER AS $$
....
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
VS
CREATE OR REPLACE FUNCTION foo() RETURNS TRIGGER AS $foo$
....
$foo$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
使用$$ vs $ foo $时有区别吗?为什么有人选择一个而不是另一个?也许我刚刚错过了一些解释差异的文档.如果有人能够启发我,我真的很感激.
我正在使用下面的函数尝试更新表.表名是函数参数.运行此函数会导致错误:
ERROR: syntax error at or near "$1"
LINE 1: (SELECT * FROM $1 ORDER BY $2 )
我尝试使用EXECUTE语句和quote_ident函数,但没有成功.我敢肯定我会忽略一些简单的事情......
CREATE OR REPLACE FUNCTION createdefaultorder(table_name varchar, sort_column varchar)
RETURNS integer AS
$BODY$
DECLARE
rRec RECORD;
counter integer := 0;
BEGIN
FOR rRec IN (SELECT * FROM table_name ORDER BY sort_column) LOOP
UPDATE table_name SET row_number = counter WHERE id = rRec.id;
counter := counter + 1;
END LOOP;
RETURN 0;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个PL/PGSQL触发器函数来检查新行的日期范围,以确保表中没有其他日期范围重叠的行(对于相同的product_id).我已经成功创建了该函数并将其设置为BEFORE INSERT触发器,但我正在试图弄清楚如何将其设置为BEFORE UPDATE触发器,因为触发器内的SELECT语句肯定会抛出异常,因为它适合重叠自身更新版本日期的标准.
这是我的功能:
CREATE OR REPLACE FUNCTION check_specials_dates()
RETURNS trigger AS
$$
DECLARE
BEGIN
IF EXISTS (SELECT * FROM rar.product_specials
WHERE product_id = NEW.product_id
AND (
(NEW.end_time between start_time and end_time) OR
(NEW.start_time between start_time and end_time) OR
(start_time between NEW.start_time and NEW.end_time))
THEN
RAISE EXCEPTION
'Cannot insert overlapping specials date for Product ID#%', NEW.product_id;
END IF;
RETURN NEW;
END
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我的想法是IF EXISTS SELECT语句将返回一个匹配项,因为它将在它尝试更新的行上匹配.
它是否正确?如果是这样,我该如何解决它?
以下是可能的吗?
我希望有一个用PL/pgSQL编写的过程,它接受类似"行集合"的参数,我的意思是我需要传递给类似字典的结构:
伪代码:
function_name({key1:val1,key2:val2, key3:val3 [, ...] })
Run Code Online (Sandbox Code Playgroud) 可能重复:
psql触发器发送电子邮件
我使用PL/Perl语言在Postgresql中发送邮件.当数据集表upload_status更改为已发布时,它会将邮件发送到数据集表中作者的电子邮件地址.并且在信中包含此作者在数据集中的一些记录.数据集PK是标识符.
例如从xx@mail.com发送到(dataset.email)@ mail.com
亲爱的博士(dataset.author)
你的......(dataset.product)已经.......
那么如何使用PL/Perl和触发函数来编写函数.
谢谢,我使用这种方法http://evilrouters.net/2008/02/01/send-email-from-postgresql/
mydb=# CREATE OR REPLACE FUNCTION mydb_mytable_insert_send_mail_function()
mydb-# RETURNS "trigger" AS
mydb-# $BODY$
mydb$# use Mail::Sendmail;
mydb$#
mydb$# $message = "A new entry has been added to the 'mytable' table.\n\n";
mydb$# $message .= "The new name is: $_TD->{new}{name}\n\n";
mydb$#
mydb$# %mail = ( From => $_[0], To => $_[1], Subject => $_[2], Message => $message);
mydb$#
mydb$# sendmail(%mail) or die $Mail::Sendmail::error;
mydb$# return undef;
mydb$# $BODY$
mydb-# LANGUAGE 'plperlu' VOLATILE;
mydb=# …Run Code Online (Sandbox Code Playgroud) 在PostgreSQL中存在一些使用批量收集的声明的方法,就像在Oracle中一样?
Oracle中的示例:
create or replace procedure prc_tst_bulk_test is
type typ_person is table of tb_person%rowtype;
v_tb_person typ_person;
begin
select *
bulk collect into v_tb_person
from tb_person;
-- make a selection in v_tb_person, for instance
select name, count(*) from v_tb_person where age > 50
union
select name, count(*) from v_tb_person where gender = 1
end;
Run Code Online (Sandbox Code Playgroud)
谢谢
发生(可预测或不可预测)错误时,是否可以在FOR循环中使用EXCEPTIONs强制继续执行?这是一个片段:
FOR temp_rec IN tlcursor LOOP
tl2 := temp_rec; --the location to be updated
--Do the Routing and UPDATE the taxilocs row.
UPDATE taxilocs20120113
SET route = pgr_trsp (
'SELECT * FROM th_2po_4pgr',
tl1.map_id, tl1.map_pos, tl2.map_id, tl2.map_pos, false, true);
tl1 := tl2;
END LOOP;
Run Code Online (Sandbox Code Playgroud)
一个例子是,在第一次迭代期间,tl1未分配。另一个可能是该函数pge_trsp()没有提供结果。如果在执行过程中发生任何这种情况,是否可以强制循环继续?
更新!!
这是我最新的代码:
CREATE OR REPLACE FUNCTION fm_seqrouting() RETURNS integer AS $$
--Declarations
DECLARE
tlcursor SCROLL CURSOR FOR SELECT
oid,
veh_id,
date_time AS dt,
th_2po_4pgr_id AS map_id,
th_2po_4pgr_position AS map_pos FROM testlocs …Run Code Online (Sandbox Code Playgroud) 我有real列类型带有示例值的表:
123456,12
0,12345678
Run Code Online (Sandbox Code Playgroud)
和存储过程中的代码:
CREATE OR REPLACE FUNCTION test3()
RETURNS integer AS
$BODY$
DECLARE
rec RECORD;
BEGIN
FOR rec IN
SELECT
gme.abs_km as km,
CAST(gme.abs_km as numeric) as cast,
round(gme.abs_km:: numeric(16,2), 2) as round
FROM gps_entry gme
LOOP
RAISE NOTICE 'Km: % , cast: % , round: %', rec.km, rec.cast, rec.round;
INSERT INTO test (km, casting, rounding) VALUES (rec.km, rec.cast, rec.round);
END LOOP;
RETURN 1;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Run Code Online (Sandbox Code Playgroud)
输出如下:
2014-02-05 12:49:53欧洲中部通知:公里:0.12345678,演员:0.123457,回合:0.12 2014-02-05 12:49:53欧洲中部通知:公里:123456.12,演员:123456,回合:123456.00
具有列的数据库表NUMERIC(19,2): …
我有一张桌子years(每只耳朵的1号).我想创建一个函数,它接受这些年中的每一年并在另一个表上运行查询来计算属于该年份的行数.我尝试用pl/pgsql实现,使用下面的代码,但我没有让它工作或在Internet上找到任何引用.
CREATE or REPLACE FUNCTION func_test(in AAA date, OUT _result int)
BEGIN
SELECT SUM(st_length(geom)) as BBB
FROM hist_line
WHERE '2006-01-01' BETWEEN valid_from AND COALESCE(valid_to, '9999-12-31');
RETURN _result BBB;
END;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION func_test(date)
select func_test('2009-01-01');
Run Code Online (Sandbox Code Playgroud)
我无法将函数内部的内容查询恢复为函数的输出.
plpgsql ×10
postgresql ×10
sql ×2
arrays ×1
database ×1
enterprisedb ×1
function ×1
loops ×1
metadata ×1
perl ×1
spl ×1
sql-function ×1
types ×1