标签: plpgsql

截断Postgres数据库中的所有表

我经常需要在重建之前删除PostgreSQL数据库中的所有数据.我将如何直接在SQL中执行此操作?

目前我已经设法提出一个SQL语句,它返回我需要执行的所有命令:

SELECT 'TRUNCATE TABLE ' ||  tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Run Code Online (Sandbox Code Playgroud)

但是,一旦拥有它们,我就无法以编程方式执行它们.

postgresql truncate dynamic-sql plpgsql database-table

142
推荐指数
8
解决办法
13万
查看次数

使用PL/pgSQL将查询结果存储在变量中

如何将查询结果分配给PL/pgSQL中的变量,这是PostgreSQL的过程语言?

我有一个功能:

CREATE OR REPLACE FUNCTION test(x numeric)
RETURNS character varying AS
$BODY$
DECLARE
name   character varying(255);
begin
 name ='SELECT name FROM test_table where id='||x;

 if(name='test')then
  --do somthing
 else
  --do the else part
 end if;
end;
return -- return my process result here
$BODY$
LANGUAGE plpgsql VOLATILE
Run Code Online (Sandbox Code Playgroud)

在上面的函数中我需要存储此查询的结果:

'SELECT name FROM test_table where id='||x;
Run Code Online (Sandbox Code Playgroud)

到变量name.

怎么处理这个?

database postgresql stored-procedures plpgsql postgresql-9.1

108
推荐指数
3
解决办法
18万
查看次数

如何创建不返回任何内容的函数

我想写一个函数pl/pgsql.我正在使用PostgresEnterprise Manager v3并使用shell来创建一个函数,但在shell中我必须定义返回类型.如果我没有定义返回类型,我就无法创建函数.

如何在没有返回结果的情况下创建函数,即创建新表的函数?

postgresql function plpgsql void

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

如何在PostgreSQL中的函数内返回SELECT的结果?

我在PostgreSQL中有这个功能,但我不知道如何返回查询结果:

CREATE OR REPLACE FUNCTION wordFrequency(maxTokens INTEGER)
  RETURNS SETOF RECORD AS
$$
BEGIN
    SELECT text, count(*), 100 / maxTokens * count(*)
    FROM (
        SELECT text
    FROM token
    WHERE chartype = 'ALPHABETIC'
    LIMIT maxTokens
    ) as tokens
    GROUP BY text
    ORDER BY count DESC
END
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在PostgreSQL函数中返回查询结果.

我发现返回类型应该是SETOF RECORD,对吗?但是返回命令不对.

这样做的正确方法是什么?

sql postgresql return return-type plpgsql

92
推荐指数
2
解决办法
14万
查看次数

什么是'$$'用于PL/pgSQL

作为PL/pgSQL的新手,这个函数中双美元符号的含义是什么:

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS $$
BEGIN
  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN
    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';
  END IF;
  RETURN true; 
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)

我猜,在RETURNS boolean AS $$,$$是一个占位符.

最后一行有点神秘: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

顺便说一句,最后一行是什么意思?

postgresql quotes plpgsql dollar-sign dollar-quoting

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

表名作为PostgreSQL函数参数

我想在Postgres函数中传递一个表名作为参数.我试过这段代码:

CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer 
AS $$
    BEGIN
    IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
     return 1;
    END IF;
    return 0;
    END;
$$ LANGUAGE plpgsql;

select some_f('table_name');
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

ERROR:  syntax error at or near "."
LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
                                                             ^

********** Error **********

ERROR: syntax error at or near "."
Run Code Online (Sandbox Code Playgroud)

以下是更改为此时出现的错误select * from quote_ident($1) tab where tab.id=1:

ERROR:  column tab.id does not exist
LINE 1: ...T EXISTS …
Run Code Online (Sandbox Code Playgroud)

postgresql function dynamic-sql plpgsql identifier

69
推荐指数
4
解决办法
7万
查看次数

有关PLPGSQL的PostgreSQL 9.1 pg_restore错误

我正在使用Postgres进行django项目,我目前正在实现一个数据库备份/恢复系统,当用户单击备份时,尽可能简单地执行pg_dump,然后在单击恢复备份时执行pg_restore.

所有看起来都很好和花花公子,直到它实际上尝试执行pg_restore,此时它给出了这个错误:

pg_restore:[archiver(db)]来自TOC条目3206的错误; 0 0 COMMENT EXTENSION plpgsql pg_restore:[archiver(db)]无法执行查询:ERROR:必须是扩展名plpgsql的所有者命令为:COMMENT ON EXTENSION plpgsql IS'PL/pgSQL procedureural language';

我已经研究了plpgsql是什么等我明白了,关于错误,我尝试手动设置"扩展的所有者"给执行脚本的用户并拥有数据库本身,但是没有改变,它真的很烦人,因为它试图设置所有事情的评论时出错

这都是由pg_dump自动创建的,因此注释行无法删除,并且没有标记可以禁用注释(我知道这一点),所以我真的不知道如何解决这个问题.

postgresql plpgsql database-restore

66
推荐指数
4
解决办法
4万
查看次数

使用pgAdmin调试PostgreSQL函数

我引用 来启用PostgreSQL服务器中的调试器,以便通过使用pgadmin单步调试plpgsql函数.

我已经设置shared_preload_libraries = '$libdir/plugins/plugin_debugger.dll'postgresql.conf,运行pldbgapi.sql,并重新启动服务器.

这些步骤应该已成功运行并且plugin_debugger.dll应该成功加载,因为可以使用该命令进行验证show shared_preload_libraries,我可以在上下文菜单中看到调试选项,右键单击pgAdmin中的函数.

在此输入图像描述

选择"Debugging" - > Debug时,会弹出一个窗口,允许我输入输入参数的值.但在那之后,当我按下时OK,它根本没有响应.

在此输入图像描述

任何想法或我错过了服务器上的调试器设置?

我正在使用PostgreSQL 8.3和pgAdmin 1.14

postgresql debugging plpgsql pgadmin

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

使用PL/pgSQL将多个字段作为PostgreSQL中的记录返回

我正在使用PL/pgSQL编写SP.
我想返回一个记录,由几个不同的表中的字段组成.看起来像这样:

CREATE OR REPLACE FUNCTION get_object_fields(name text)
  RETURNS RECORD AS $$
BEGIN
  -- fetch fields f1, f2 and f3 from table t1
  -- fetch fields f4, f5 from table t2
  -- fetch fields f6, f7 and f8 from table t3
  -- return fields f1 ... f8 as a record
END
$$ language plpgsql; 
Run Code Online (Sandbox Code Playgroud)

如何将不同表中的字段作为单个记录中的字段返回?

[编辑]

我已经意识到我上面给出的例子有点过于简单了.我需要检索的一些字段将被保存为要查询的数据库表中的单独行,但我想在"展平"记录结构中返回它们.

下面的代码应该有助于进一步说明:

CREATE TABLE user (id int, school_id int, name varchar(32));

CREATE TYPE my_type (
  user1_id   int,
  user1_name varchar(32),
  user2_id   int,
  user2_name varchar(32)
); …
Run Code Online (Sandbox Code Playgroud)

sql postgresql types stored-procedures plpgsql

64
推荐指数
4
解决办法
14万
查看次数

PostgreSQL IF语句

我如何在Postgres中进行此类查询?

IF (select count(*) from orders) > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);
Run Code Online (Sandbox Code Playgroud)

sql postgresql if-statement plpgsql

63
推荐指数
4
解决办法
16万
查看次数