我经常需要在重建之前删除PostgreSQL数据库中的所有数据.我将如何直接在SQL中执行此操作?
目前我已经设法提出一个SQL语句,它返回我需要执行的所有命令:
SELECT 'TRUNCATE TABLE ' || tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Run Code Online (Sandbox Code Playgroud)
但是,一旦拥有它们,我就无法以编程方式执行它们.
如何将查询结果分配给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
我想写一个函数pl/pgsql
.我正在使用PostgresEnterprise Manager v3并使用shell来创建一个函数,但在shell中我必须定义返回类型.如果我没有定义返回类型,我就无法创建函数.
如何在没有返回结果的情况下创建函数,即创建新表的函数?
我在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
,对吗?但是返回命令不对.
这样做的正确方法是什么?
作为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;
顺便说一句,最后一行是什么意思?
我想在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) 我正在使用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服务器中的调试器,以便通过使用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
我正在使用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) 我如何在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) plpgsql ×10
postgresql ×10
sql ×3
dynamic-sql ×2
function ×2
database ×1
debugging ×1
dollar-sign ×1
identifier ×1
if-statement ×1
pgadmin ×1
quotes ×1
return ×1
return-type ×1
truncate ×1
types ×1
void ×1