标签: plpgsql

将Oracle PL/SQL转换为Postgresql PL/pgSQL的工具

是否有一个工具(最好是免费的)将Oracle的PL/SQL存储过程语言转换为Postgresql的PL/pgSQL存储过程语言?

oracle postgresql plsql translation plpgsql

7
推荐指数
3
解决办法
2万
查看次数

PGAdmin中的PostgreSQL语法错误

我是PostgreSQL的新手,并且正在使用PGAdmin中的查询工具.我正在尝试运行使用变量的pgsql查询,但我似乎无法正确使用语法.

这是一个给出语法错误的示例查询:

DECLARE
  num INTEGER;

BEGIN

  num := 3;
  PRINT num;

END;
Run Code Online (Sandbox Code Playgroud)

更新:
好的,让我试试解释一下.我来自SQL服务器背景.在管理工作室中,我可以打开一个查询窗口并使用(T)-SQL查询.

例如,我可以写这样的东西:

DECLARE @num INT
SET @num = 3
SELECT @num
Run Code Online (Sandbox Code Playgroud)

我知道这是一个愚蠢的例子,但我只是试图声明一个变量并用它做一些事情.我正在尝试熟悉PL/PGSQL.


再次更新:再次
是我.我正在尝试下面的脚本并获得"[ERROR] 7.0-2:语法错误,意外字符".这是否适用于PGAdmin?

DECLARE
  num INTEGER;

BEGIN

  num := 3;
  RAISE NOTICE '%', num;

END;
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

7
推荐指数
3
解决办法
2万
查看次数

一个简单的pg/plsql循环示例

我们正在重新设计postgres中的表模式.它曾经有两个表partner和advertiser名称的链接表,partner_advertiser因为我们假设合作伙伴和广告商之间有很多关系.进行更改,使得advertiser只有一个partner,因此partner将具有一个可能的关系advertiser.

如何在不丢失先前信息的情况下进行更改?必须使用链接器表数据来填充新架构设计的映射.这是我的初始代码:

BEGIN

FOR r IN SELECT partnerid, advertiserid from partner_advertiser
    LOOP
    NEXT r;
    UPDATE advertiser SET partnerid = r.partnerid WHERE id = r.advertiserid 
    END LOOP;

END
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我自己没有做过任何pg/plsql.所以,如果我有任何基本步骤,请给我一个提醒.

postgresql data-migration plpgsql

7
推荐指数
2
解决办法
6万
查看次数

PostgreSQL触发器无法正常工作 - 既不是BEFORE也不是AFTER DELETE

我刚刚离开MySQL而支持PostgreSQL,我对触发器有疑问.如果在"进程"表中删除了一行,则此触发器用于更新"工作流"表中的字段.

CREATE OR REPLACE FUNCTION fn_process_delete() RETURNS TRIGGER AS $$
BEGIN
    UPDATE workflow SET deleted_process_name = OLD.process_name
    WHERE process_id = OLD.process_id;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS process_delete ON processes;
CREATE TRIGGER process_delete
AFTER DELETE ON processes
FOR EACH ROW 
EXECUTE PROCEDURE fn_process_delete();
Run Code Online (Sandbox Code Playgroud)

我的问题是双重的:

  1. 如果我如上所述使用AFTER DELETE,则该行将被删除,但update语句不会更新"workflow"表中的字段.

  2. 如果我使用BEFORE DELETE,则进程表将根本不执行删除并发出错误消息"此行没有唯一标识符".

任何人都可以建议吗?

postgresql triggers plpgsql

7
推荐指数
1
解决办法
9273
查看次数

在postgreSQL中引发错误

CREATE OR REPLACE FUNCTION msgfailerror() RETURNS trigger AS 
' BEGIN 
    IF NEW.noces< new.first_column THEN 
        RAISE EXCEPTION 'cannot have a negative salary'; 
    END IF; 
   return new; 
END' LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

触发

create trigger msgfail before insert on first for each row 
execute procedure msgfailerror()
Run Code Online (Sandbox Code Playgroud)

给出错误:

"不能"或其附近的语法错误第5行:RAISE EXCEPTION'不能有负面...

对于每个行字段,我几乎有一个验证.我希望触发器在插入完成时检查所有验证,然后一次性提高错误日志.我应该在加薪通知中使用加薪例外吗?

例如:

Insert into first (first_column, noces,dob) values ('4545','75','545') 
Run Code Online (Sandbox Code Playgroud)

我正在检查noces是否小于first_column,对于同一行我想检查dob> 80以及first_column是否为整数并且为所有验证引发错误.提前致谢

postgresql plpgsql quoting

7
推荐指数
2
解决办法
3万
查看次数

测试使用和返回refcursor的PostgreSQL函数

我想测试Postgres函数的结果(不可能改变函数).

该函数接收REFCURSOR和其他几个参数作为参数,并返回相同的RECURSOR.

get_function_that_returns_cursor(ret, 4100, 'SOMETHING', 123465)
Run Code Online (Sandbox Code Playgroud)

现在我想在Postgres中创建一个小测试来获得这个FUNCTION的结果.像下面的代码(这是我的方法,但它不起作用):

DO $$ DECLARE
 ret REFCURSOR; 
 row_to_read table_it_will_return%ROWTYPE ;
BEGIN
 PERFORM get_function_that_returns_cursor(ret, 4100, 'SOMETHING', 123465);
-- OR SELECT get_function_that_returns_cursor(ret, 4100, 'SOMETHING', 123465) INTO ret
 FOR row_to_read IN SELECT * FROM ret LOOP
   -- (...)
   RAISE NOTICE 'Row read...';
 END LOOP;
 CLOSE ret;
END $$;
Run Code Online (Sandbox Code Playgroud)

有关如何使其工作的任何建议?一种通用解决方案,可用于测试此类函数(获取Cursor并返回Cursor?

如果我们不知道返回的行类型怎么能这样做呢?

在PostgresQL中调试此类事物的最佳方法是什么?

sql postgresql plpgsql cursor

7
推荐指数
1
解决办法
8869
查看次数

从Ruby on Rails调用PL/pgSQL存储过程

我正在开发一个项目,我在PostgreSQL环境中担任数据库设计师/管理员.领导者决定将Rails用于应用程序逻辑并招募一名Rails程序员.

Rails程序员说他通常会编写所有应用程序代码,并且不喜欢让某人通过他存储过程而导致缺乏控制,并且他从未在rails中完成过.

数据库使用了很多继承/ EERM,因此存储过程和触发器将使他的工作变得更容易,除了使用procs的性能优势.

我有四个问题:

1)如何从没有返回值的Rails调用pl/pgSQL存储过程

2)如何使用单个返回值(1行/ 1列)从Rails调用pl/pgSQL存储过程

3)如何从Rails调用pl/pgSQL存储过程,其中1行多列返回值.

4)如何使用OUT参数从Rails调用pl/pgSQL存储过程?

谢谢!

ruby stored-procedures ruby-on-rails plpgsql rails-postgresql

7
推荐指数
1
解决办法
3580
查看次数

PL /代理返回存储过程调用中不支持的类型

我在PL/Proxy中设置了一个存储过程来进行查询,然后收回一些RECORD.

在PL /代理中:

CREATE OR REPLACE FUNCTION query_autocomplete(q text, i_id bigint)
RETURNS SETOF RECORD AS $$
    CLUSTER 'autocompletecluster';
    RUN ON i_id;
$$ LANGUAGE plproxy;
Run Code Online (Sandbox Code Playgroud)

在每个分区中:

CREATE OR REPLACE FUNCTION query_autocomplete(q text, i_id bigint)
RETURNS SETOF RECORD AS $$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN EXECUTE q
    LOOP
        RETURN NEXT rec;
    END LOOP;
    RETURN;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

正如您可能猜到的那样,这是在PGSQL中命名为'autocompletecluster'的定义的SERVER.我发送的查询字符串如下:

$sql = "SELECT * FROM autocomplete WHERE member_id = :memberId";
$query = $this->db->prepare("SELECT query_autocomplete('{$sql}',1234");
Run Code Online (Sandbox Code Playgroud)

它返回以下内容:

SQLSTATE[XX000]: Internal error: 7 ERROR:  PL/Proxy …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

7
推荐指数
1
解决办法
335
查看次数

如何在PostgreSQL中创建guid

如何在Postgres 9.0+中以Windows格式创建GUID?

我试过功能

CREATE or REPLACE FUNCTION public.getguid() RETURNS varchar AS $BODY$ 
DECLARE 
  v_seed_value varchar(32); 
BEGIN 
  select 
    md5( 
      inet_client_addr()::varchar || 
      timeofday() || 
      inet_server_addr()::varchar || 
      to_hex(inet_client_port()) 
    ) 
  into v_seed_value; 

  return (substr(v_seed_value,1,8) || '-' || 
          substr(v_seed_value,9,4) || '-' || 
          substr(v_seed_value,13,4) || '-' || 
          substr(v_seed_value,17,4) || '-' || 
          substr(v_seed_value,21,12)); 
END; $BODY$ LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER;
Run Code Online (Sandbox Code Playgroud)

从

http://postgresql.1045698.n5.nabble.com/newid-in-postgres-td1879346.html

试着

select getguid()
union all
select getguid()
Run Code Online (Sandbox Code Playgroud)

但它返回相同的值

"c41121ed-b6fb-c9a6-bc9b-574c82929e7e"
"c41121ed-b6fb-c9a6-bc9b-574c82929e7e"
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题,以便返回唯一的行?

postgresql guid plpgsql

7
推荐指数
1
解决办法
2万
查看次数

PostgreSQL临时表的范围是什么?

我已经google了很多,我有相当不错的阅读理解,但我不明白这个脚本是否可以在我的postgres/postgis框中的多个线程中工作.这是代码:

Do
$do$
DECLARE
    x RECORD;
    b int;       
    begin
    create temp table geoms (id serial, geom geometry) on commit drop;

    for x in select id,geom from asdf loop   

        truncate table geoms;
        insert into geoms (geom) select someGeomfield from sometable where st_intersects(somegeomfield,x.geom);

        ----do something with the records in geoms here...and insert that data somewhere else

    end loop;
end;
$do$
Run Code Online (Sandbox Code Playgroud)

那么,如果我在多个客户端(从Java调用)中运行它,那么geoms临时表的范围会导致问题吗?如果是这样,在PostGres中解决这个问题的任何想法都会有所帮助.

谢谢

plpgsql postgresql-9.3

7
推荐指数
1
解决办法
1841
查看次数