标签: plpgsql

默认情况下,使emacs突出显示postgresql语法

我使用emacs来编辑我的sql代码.我99%的时间都在postgresql plpgsql代码上工作.扩展名为.sql的所有文件都包含postgresql.我很好奇有没有办法设置sql-highlight-postgres-keywords SQL突出显示默认值而不是ANSI SQL,因为每次打开文件时切换模式都很烦人.

postgresql emacs plpgsql

16
推荐指数
2
解决办法
2770
查看次数

PostgreSQL参数化表函数中的Order By/Limit

我有一个sql函数,它执行一个简单的sql select语句:

CREATE OR REPLACE FUNCTION getStuff(param character varying)
  RETURNS SETOF stuff AS
$BODY$
    select *
    from stuff
    where col = $1
$BODY$
  LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

现在我调用这个函数是这样的:

select * from getStuff('hello');
Run Code Online (Sandbox Code Playgroud)

如果我需要订购并限制结果order by和limit条款,我有哪些选择?

我想这样的查询:

select * from getStuff('hello') order by col2 limit 100;
Run Code Online (Sandbox Code Playgroud)

效率不高,因为表中的所有行都stuff将由函数返回,getStuff然后按限制排序和切片.

但即使我是对的,如何通过sql语言函数的参数传递顺序也没有简单的方法.只能传递值,而不能传递sql语句的一部分.

另一种选择是用plpgsql语言创建函数,在那里可以构造查询并通过它来执行EXECUTE.但这也不是一个非常好的方法.

那么,有没有其他方法可以实现这一目标?或者你会选择什么选择?在函数外部订购/限制,还是plpgsql?

我正在使用postgresql 9.1.

编辑

我修改了CREATE FUNCTION语句,如下所示:

CREATE OR REPLACE FUNCTION getStuff(param character varying, orderby character varying)
  RETURNS SETOF stuff AS
$BODY$
    select t.* …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql dynamic-sql plpgsql

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

如何在DO块中执行选择查询?

我想将以下SQL代码从MS SQL-Server移植到PostgreSQL.

DECLARE @iStartYear integer
DECLARE @iStartMonth integer

DECLARE @iEndYear integer
DECLARE @iEndMonth integer

SET @iStartYear = 2012
SET @iStartMonth = 4

SET @iEndYear = 2016
SET @iEndMonth = 1


;WITH CTE 
AS
(
    SELECT 
         --@iStartYear AS TheStartYear 
         @iStartMonth AS TheRunningMonth 
        ,@iStartYear AS TheYear  
        ,@iStartMonth AS TheMonth 

    UNION ALL 

    SELECT 
         --CTE.TheStartYear AS TheStartYear 
         --@iStartYear AS TheStartYear 
         CTE.TheRunningMonth + 1 AS TheRunningMonth 
         --,CTE.TheStartYear + (CTE.TheRunningMonth / 12) AS TheYear 
        ,@iStartYear + (CTE.TheRunningMonth / 12) AS TheYear 
        ,(CTE.TheMonth + 1 -1) % …
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql postgresql-9.1 generate-series

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

PL/pgSQL中的BREAK语句

如何break在PostgreSQL中使用该语句?我有这样的结构:

for()
 {
 for()
 {
  if(somecondition)
  break;
 }
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,它应该只打破内for循环?

postgresql loops plpgsql break

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

在plpgsql函数中将表和列名定义为参数?

它必须简单,但我正在迈出Postgres函数的第一步,我找不到任何有效的东西......

我想创建一个修改表和/或列的函数,我找不到在我的函数中指定我的表和列作为参数的正确方法.

就像是:

CREATE OR REPLACE FUNCTION foo(t table)
RETURNS void AS $$
BEGIN
   alter table t add column c1 varchar(20);
   alter table t add column c2 varchar(20);
   alter table t add column c3 varchar(20);
   alter table t add column c4 varchar(20);
END;
$$ LANGUAGE PLPGSQL;

select foo(some_table)
Run Code Online (Sandbox Code Playgroud)

在另一种情况下,我想要一个改变某个表中某个列的函数:

CREATE OR REPLACE FUNCTION foo(t table, c column)
RETURNS void AS $$
BEGIN
   UPDATE t SET c = "This is a test";
END;
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)

有可能吗?

postgresql variables function dynamic-sql plpgsql

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

对于每个语句触发器示例

我一直在查看postgresql触发器的文档,但它似乎只显示行级触发器的示例,但我找不到语句级触发器的示例.

特别是,如何在单个语句中迭代更新/插入行并不是很清楚,因为它NEW是针对单个记录的.

postgresql triggers plpgsql

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

删除postgres中共享相同前缀的所有表

我想使用一个sql命令/查询从同一个数据库中删除所有共享相同前缀('supenh_agk')的表.

sql postgresql dynamic-sql plpgsql

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

如何在plpgsql中使用记录类型变量?

如何将存储在记录类型变量中的查询结果用于同一存储函数中的另一个查询?我使用Postgres 9.4.4.

用这样的表:

create table test (id int, tags text[]);
insert into test values (1,'{a,b,c}'),
                        (2,'{c,d,e}');
Run Code Online (Sandbox Code Playgroud)

我写了一个函数(简化),如下所示:

CREATE OR REPLACE FUNCTION func(_tbl regclass)
RETURNS TABLE (t TEXT[], e TEXT[])
LANGUAGE plpgsql AS $$
DECLARE
  t RECORD;
  c INT;
BEGIN
  EXECUTE format('SELECT id, tags FROM %s', _tbl) INTO t;
  SELECT count(*) FROM t INTO c;
  RAISE NOTICE '% results', c;
  SELECT * FROM t;
END
$$;
Run Code Online (Sandbox Code Playgroud)

......但没有奏效:

select func('test');
Run Code Online (Sandbox Code Playgroud)
ERROR:  42P01: relation "t" does not exist
LINE 1: SELECT count(*) FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql variables function plpgsql table-variable

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

函数中的PostgreSQL CASE用法

我们不能CASE在SQL SELECT语句之外使用条件吗?

例如:

CASE 
  WHEN old.applies_to = 'admin' THEN _applies_to = 'My Self'
  ELSE _applies_to = initcap(old.applies_to)
END
 _summary = _summary || '<li>Apply To: ' || _applies_to || '</li>';
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ERROR:  syntax error at or near "_summary"
LINE 86: _summary = _summary || '<li>Apply To: ' || _applies ...
Run Code Online (Sandbox Code Playgroud)

postgresql conditional case plpgsql

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

PL/pgSQL执行vs执行

在PL/pgSQL上执行和执行有什么区别?

从手册:

有时,评估表达式或SELECT查询但丢弃结果很有用,例如在调用具有副作用但没有有用结果值的函数时.要在PL/pgSQL中执行此操作,请使用PERFORM语句.

但是,当我尝试这样的事情时:

perform 'create table foo as (select 1)';
Run Code Online (Sandbox Code Playgroud)

什么都没发生.虽然此查询应该有副作用(创建表),但结果可以被丢弃.

我想我有一件事是正确的:为了运行我可以使用的函数:

perform pg_temp.addInheritance(foo);
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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