标签: plpgsql

在postgresql中使用plpgsql有什么好处

除了语法糖和表现力之外,运行效率的差异是什么.我的意思是,plpgsql可以比plpythonu或pljava快吗?或者它们大致相等?

我们正在使用存储过程来检测中等大小的数据库(大约10M的记录)中几乎重复的人员记录的任务

postgresql stored-procedures plpgsql

8
推荐指数
2
解决办法
2543
查看次数

使用||在RAISE NOTICE上抛出错误的PostgreSQL错误 操作者

使用以下代码行获得以下错误:

RAISE NOTICE '*** Rolling back job run id ' || CONVERT(varchar, v_job_run_id)
             || ' for table ' || v_table_name || '***';
Run Code Online (Sandbox Code Playgroud)

错误:

错误:"|"处或附近的语法错误 第43行:提高通知' *
回滚作业运行ID'|| CONVERT(VAR ...

postgresql plpgsql

8
推荐指数
1
解决办法
4549
查看次数

在plpgsql中增加循环中的数字

我不能立即从例子中找到这个.我想在一个函数中增加循环中的变量.

例如:

DECLARE
   iterator float4;
BEGIN
   iterator = 1;

    while iterator < 999
       .....
      iterator ++;
END;
Run Code Online (Sandbox Code Playgroud)

怎么做?

我正在查看有关流量控制的文档:http:
//www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html

并且它们似乎都不适合我,除非这些绝对是模拟递增变量的唯一方法.

sql postgresql increment plpgsql postgresql-8.4

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

plpgsql函数内部的事务

我已经编写了一个自动化功能,如下所述,它根据一些规则调用其他一些功能.该函数给出了我想要的结果,但我面临的问题是它在内部处理每个函数后都没有提交数据.一旦主要功能完成,它就会提交整个数据.我想做一个内部事务,它应该在内部函数执行完成时提交数据.我尝试在每个PERFORM语句之后给出一个COMMIT语句,但是我收到一个错误,说"无法在PL/pgSQL中开始/结束事务".

任何人都可以建议我如何在函数内部进行事务处理.

CREATE OR REPLACE FUNCTION ccdb.fn_automation_for_updation()
  RETURNS void AS
$BODY$

DECLARE 
sec_col refcursor;
cnt integer;
sec_code ccdb.update_qtable%ROWTYPE;
new_cnt integer;

BEGIN

SELECT COUNT(*)
INTO cnt
FROM ccdb.update_qtable
WHERE status_flag IN (-1,1);

OPEN sec_col FOR
    SELECT * FROM ccdb.update_qtable WHERE status_flag IN (-1,1);

FOR i IN 1..cnt
LOOP

    FETCH sec_col INTO sec_code;

        PERFORM ccdb.o_dtr_update(sec_code.section_code);

        PERFORM ccdb.o_consumer_update_for_update(sec_code.section_code);

        PERFORM ccdb.o_consumer_update_for_insert(sec_code.section_code);

        PERFORM ccdb.o_bills_update_for_update(sec_code.section_code);

        PERFORM ccdb.o_bills_update_for_insert(sec_code.section_code);

        PERFORM ccdb.o_payments_update_for_update_new(sec_code.section_code);

        PERFORM ccdb.o_payments_update_for_insert(sec_code.section_code);

        PERFORM ccdb.o_payments_map_update_for_update(sec_code.section_code);

        PERFORM ccdb.o_payments_map_update_for_insert(sec_code.section_code);

        SELECT COUNT(*) INTO new_cnt FROM ccdb.update_qtable WHERE status_flag IN (-1,1);

        IF …
Run Code Online (Sandbox Code Playgroud)

postgresql transactions plpgsql

8
推荐指数
1
解决办法
3万
查看次数

如何使用"RAISE INFO,RAISE LOG,RAISE DEBUG"来跟踪PostgreSQL函数的登录?

CREATE OR REPLACE FUNCTION mover(src text, dst text, cpquery text, conname text, ifbin boolean) returns void as
$$
        DECLARE
                cnt integer;
                dlcnt integer;
                del_count integer;
                ret text;

        BEGIN
                SELECT  pg_catalog.dblink_copy_open(conname, dst, ifbin) INTO ret ;
                RAISE LOG 'dblink_open %',ret;

                execute 'SELECT  1 as check FROM ' || src ||' limit 1' into cnt;
                IF cnt=0 THEN
                        PERFORM pg_sleep(2);
                END IF;

                IF ifbin=true THEN
                        RAISE DEBUG 'Start to Copy data with binary';
                        execute 'COPY (' || cpquery || '  ) to …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql debug-print

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

在PostgreSQL上分析/分析查询

我刚刚继承了旧的PostgreSQL安装,需要做一些诊断来找出这个数据库运行缓慢的原因.在MS SQL上,您将使用Profiler等工具查看正在运行的查询,然后查看其执行计划的外观.

PostgreSQL存在哪些工具,如果有的话,我可以用它做什么?我很感激任何帮助,因为我对Postgres很新.

sql postgresql plpgsql postgresql-8.4

8
推荐指数
2
解决办法
4763
查看次数

Postgres在转换时返回函数错误/失败时的空值

我试图将text值转换为timestamp值.对于下表称为a:

 id |         c1
----+--------------------
  1 | 03-03-2000
  2 | 01-01-2000
  3 | 12/4/1990
  4 | 12 Sept 2011
  5 | 12-1-1999 12:33:12
  6 | 24-04-89 2:33 am
Run Code Online (Sandbox Code Playgroud)

我试图select用演员表演如下:

select id, c1,c1::timestampas c2 from a;

这正常工作,如果有只有前5行,但第6行地方c1是24-04-89 2:33 am它引发以下错误:

错误:日期/时间字段值超出范围:"24-04-89 2:33 am"
提示:也许您需要一个不同的"日期样式"设置.

我想要的是null那些不能被转换为时间戳而不是命令完全失败的值.像这样:

 id |         c1         |         c2
----+--------------------+---------------------
  1 | 03-03-2000         | 2000-03-03 00:00:00
  2 | 01-01-2000         | 2000-01-01 00:00:00 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql casting plpgsql

8
推荐指数
1
解决办法
3412
查看次数

如何在c#中返回postgresql函数的结果?控制台输出为空

我有问题,我在postgresql中有一个函数,计算两个整数,应该将结果返回到c#(npgsql)conosle,我不知道我的错误在哪里,因为调试器没有对我说什么,这是很有帮助.

所以首先是c#的代码和函数的代码.

                ...
            cmd.Parameters["x"].Value = 20;
            cmd.Parameters["y"].Value = 22;
            connection.Open();

            if (connection.State == System.Data.ConnectionState.Open) {
                //Console.WriteLine(cmd.Parameters["x"].Value);
                command.ExecuteNonQuery();
                Console.WriteLine(cmd.Parameters["sum"].Value);

            }
Run Code Online (Sandbox Code Playgroud)

现在DB的代码:

CREATE OR REPLACE FUNCTION t2(
    IN x integer,
    IN y integer,
    OUT sum integer)
  RETURNS integer AS
$BODY$BEGIN
    sum := x + y;
    INSERT INTO  t2 (x, y, sum) values (x, y, sum);
END
Run Code Online (Sandbox Code Playgroud)

所以,当我尝试运行它时,

Console.WriteLine(cmd.Parameters["sum"].Value);
Run Code Online (Sandbox Code Playgroud)

将为空且["sum"].值为NULL.我究竟做错了什么?我是对的,当我说"sum"是一个OUT变量时,我不需要返回吗?

请帮忙.

求助了,谢谢大家!@Patrick给了我正确的答案: 使用ExecuteScalar()而不是ExecuteNonQuery()

c# postgresql plpgsql

8
推荐指数
1
解决办法
2830
查看次数

插入COALESCE(NULL,默认值)

我有使用UUID的表.我希望能够在有或没有UUID的情况下插入新行,因为有时客户端会生成UUID,有时则不会.

每个表都有它的核心:

CREATE TABLE IF NOT EXISTS person (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid()
);
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用函数来插入行.我希望能够传递一个NULL id并获得一个默认值(生成的UUID).我有这样的事情:

CREATE OR REPLACE FUNCTION create_person(
    id UUID
) RETURNS BOOLEAN LANGUAGE plpgsql SECURITY DEFINER AS $$
BEGIN
    INSERT INTO person( id )
    VALUES (
        COALESCE(id,default)
    );
    RETURN FOUND;
END;
$$;
Run Code Online (Sandbox Code Playgroud)

我试过这个:

INSERT INTO person ( id ) VALUES (
    COALESCE(id, default),
);
Run Code Online (Sandbox Code Playgroud)

还有这个:

INSERT INTO person ( id ) VALUES (
  CASE WHEN id IS NULL THEN default ELSE id END
); …
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql

8
推荐指数
2
解决办法
4872
查看次数

根据它们的用途,预准备语句和SQL或PL/pgSQL函数之间有什么区别?

在PostgreSQL中,就其目的,优点和缺点而言,预准备语句与SQL或PL/pgSQL函数之间有什么区别?我们什么时候用哪个?

在这个非常简单的例子中,它们是否正常工作,对吗?

CREATE TABLE foo (id INT, name VARCHAR(80)); 

CREATE FUNCTION myfunc1(INT, VARCHAR(80)) RETURNS void AS ' 
INSERT INTO foo VALUES ($1, $2);
' LANGUAGE SQL; 

SELECT myfunc1(3, 'ben');

CREATE FUNCTION myfunc2(INT, VARCHAR(80)) RETURNS void AS ' 
BEGIN
INSERT INTO foo VALUES ($1, $2);
END' LANGUAGE plpgsql; 

SELECT myfunc2(3, 'ben');

PREPARE fooplan (INT, VARCHAR(80)) AS
    INSERT INTO foo VALUES($1, $2);
PREPARE

EXECUTE fooplan(3, 'ben');
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql prepared-statement sql-function

8
推荐指数
1
解决办法
5671
查看次数