标签: plpgsql

如何找到加载到EnterpriseDB中的语言?

如何找到已加载到EnterpriseDB中的语言(PL/pgsql,SPL,Java)?如果有人知道在PostgreSQL上找到加载语言的方法,那么EnterpriseDB建立在PostgreSQL之上.它应该工作相同.

postgresql spl metadata plpgsql enterprisedb

0
推荐指数
1
解决办法
2259
查看次数

有什么不同

我甚至不确定这叫什么?

但我正在尝试学习写这样的函数在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 $时有区别吗?为什么有人选择一个而不是另一个?也许我刚刚错过了一些解释差异的文档.如果有人能够启发我,我真的很感激.

sql database postgresql plpgsql

0
推荐指数
1
解决办法
70
查看次数

为什么postgres不接受函数参数作为表名

我正在使用下面的函数尝试更新表.表名是函数参数.运行此函数会导致错误:

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)

postgresql function plpgsql

0
推荐指数
1
解决办法
2054
查看次数

使用同一个表中的select来更新前的PLpgsql

我正在尝试创建一个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语句将返回一个匹配项,因为它将在它尝试更新的行上匹配.

它是否正确?如果是这样,我该如何解决它?

postgresql plpgsql

0
推荐指数
1
解决办法
1690
查看次数

PL/pgSQL行数组

以下是可能的吗?
我希望有一个用PL/pgSQL编写的过程,它接受类似"行集合"的参数,我的意思是我需要传递给类似字典的结构:

伪代码:

function_name({key1:val1,key2:val2, key3:val3 [, ...] })
Run Code Online (Sandbox Code Playgroud)

arrays postgresql plpgsql

0
推荐指数
1
解决办法
4655
查看次数

PL/Perl在Postgresql中发送邮件

可能重复:
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 perl plpgsql

0
推荐指数
2
解决办法
2325
查看次数

PostgreSQL相当于Oracle"批量收集"

在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)

谢谢

postgresql plpgsql

0
推荐指数
2
解决办法
9177
查看次数

我可以在FOR LOOP中使用EXCEPTIONs强制错误继续吗?

发生(可预测或不可预测)错误时,是否可以在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)

postgresql loops exception-handling plpgsql

0
推荐指数
1
解决办法
8671
查看次数

如何将REAL类型四舍五入为NUMERIC?

我有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): …

postgresql types stored-procedures plpgsql postgresql-8.3

0
推荐指数
1
解决办法
3290
查看次数

PostgreSQL函数,select返回一个值

我有一张桌子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)

我无法将函数内部的内容查询恢复为函数的输出.

sql postgresql plpgsql sql-function

0
推荐指数
1
解决办法
7483
查看次数