标签: plpgsql

直接在数据库上处理大量数据是个好主意吗?

我有一个存储了很多网页的数据库.

我将需要处理我拥有的所有数据,因此我有两个选择:将数据恢复到程序或直接在数据库中处理我将创建的一些函数.

我想知道的是:

  • 在数据库中做一些处理,而不是在应用程序中是个好主意?
  • 什么时候推荐,什么时候不推荐?
  • 有利有弊吗?
  • 是否可以将语言扩展到新功能(外部API /库)?

我尝试将内容检索到应用程序(工作),但是要慢和脏.我当务之急是在数据库中无法做我在Java中可以做什么,但我不知道这是否属实.

只是一个例子:我有一张叫做的桌子Token.目前,它有180,000行,但这将增加到超过1000万行.我需要做一些处理来知道被归类为"专有名称"的两个令牌之间的单词是否是名称的一部分.

我需要处理所有数据.在这种情况下,直接在数据库上执行比检索应用程序更好吗?

java database postgresql plpgsql

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

有人可以解释这个SQL吗?(以及我如何'参数化'并作为函数调用?)

我遇到过这个"voodoo"SQL,它用于从表中执行自定义数据分组.我想知道它是如何做到的,但是我无法理解它.一位SQL专家可以用简单的英语向那些不太熟悉SQL的人解释这个片段的各个部分,它可以让它发挥其魔力吗?

select ceil(rnk/10.0) as grp,
       col1, col2, col3, col4, col5, col6, col7
from (select e.col1, e.col2, e.col3, e.col4, e.col5, e.col6, e.col7,
             (select count(*) 
              from mytable d
              where e.col1 > d.col1)+1 as rnk
      from mytable e) x
order by grp;
Run Code Online (Sandbox Code Playgroud)

上面我无法理解的SQL部分是返回列'x'的内部SQL:

(select count(*) from mytable d
                where e.col1 > d.col1)+1 as rnk
                from mytable e
                ) x
Run Code Online (Sandbox Code Playgroud)

我希望能够自己运行该查询:

select count(*) from mytable d
                where e.col1 > d.col1)+1 as rnk
                from mytable e
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我收到错误:

错误:语法错误在"+"处或附近第2行:其中e.col1> d.col1)+1为rnk

那么,那里发生了什么?!

此外,当前的SQL使用数字10进行硬编码.我想在其周围包装一个函数,以便能够使用10以外的数字调用该函数.

后端数据库是PostgreSQL,因此该函数将在PL/pgSQL中.这是我第一次尝试编写这样的函数 - 但是,这不太正确,因为我想返回指定列的多行 - …

sql postgresql plpgsql

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

按重复属性分组

基本上我有一个表messages,其中user_id包含标识创建消息的用户的字段.

当我在两个用户之间显示一个对话(一组消息)时,我希望能够user_id按照一种棘手的方式对消息进行分组:

假设有一些消息(排序依据created_at desc):

  id: 1, user_id: 1
  id: 2, user_id: 1
  id: 3, user_id: 2
  id: 4, user_id: 2
  id: 5, user_id: 1
Run Code Online (Sandbox Code Playgroud)

我希望按以下顺序获得3个消息组: [1,2], [3,4], [5]

它应该按*user_id*分组,直到它看到另一个,然后按那个分组.

我正在使用PostgreSQL,并乐意使用特定的东西,无论什么能带来最佳性能.

sql postgresql ruby-on-rails plpgsql window-functions

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

postgres/plsql生成的字符串创建额外的双引号

我在postgres中使用plsql函数循环遍历大型数据集,并使用每个记录中的数据生成字符串.出于某种原因,我得到了不必要的额外双引号,如下所示:

'{ ""id"": ""1""}'
Run Code Online (Sandbox Code Playgroud)

它应该看起来像

'{ "id": "1"}'
Run Code Online (Sandbox Code Playgroud)

另外,我注意到字符串开头和结尾有不需要的括号.我正在使用的代码如下:

CREATE FUNCTION gen_blocks()
    RETURNS TEXT  AS $$ DECLARE
    output TEXT := '';
    j record; BEGIN
    FOR j IN SELECT '{ "id": "' || id ||'"},' LOOP
        output := output || j;
    END LOOP;

    return output; END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

database string postgresql plpgsql

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

postgresql存储过程返回多个表

我有一个函数需要从多个表返回结果.这可以在Postgresql中实现吗(9.1现在,计划很快迁移到9.2)?如果是这样,怎么样.

例如

create or replace function f1()
returns ???
as $body$ begin
    return query select x.*
        from users x;
    return query select x.*
        from user_preferences x join users y using(user_id) ; -- more where clauses
    return query select x.*
        from user_permissions x join users y using(user_id) ; -- more clauses
end; $body$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

我考虑的替代方案是:(a)做一个用户和user_preferences(等)的笛卡尔积,但这将导致一个巨大的结果表和一个真正复杂的代码.(b)首先对用户进行选择,然后迭代用户列表并根据其属性进行额外的迭代,但这将导致太多的数据库调用.而且,为什么我要编写SQL非常擅长的代码?

是否有一种简洁的方法可以从pg函数中获取多个结果集?我搜索了postgresql文档但找不到任何指导.

非常感谢.

postgresql plpgsql

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

在单个参数中传递多个值

我想通过在单个参数上传递多个值来调用函数,如下所示:

SELECT * FROM jobTitle('270,378');
Run Code Online (Sandbox Code Playgroud)

这是我的功能。

CREATE OR REPLACE FUNCTION test(int)
RETURNS TABLE (job_id int, job_reference int, job_job_title text
                                            , job_status text) AS
$$
BEGIN
RETURN QUERY
select jobs.id,jobs.reference, jobs.job_title,
       ltrim(substring(jobs.status,3,char_length(jobs.status))) as status
FROM jobs ,company c
WHERE jobs."DeleteFlag" = '0'
and c.id= jobs.id and c.DeleteFlag = '0' and c.active = '1' 
and (jobs.id = $1 or -1 = $1)
order by jobs.job_title;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

有人可以提供语法帮助吗?甚至提供示例代码?

sql postgresql stored-procedures plpgsql parameter-passing

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

在Postgresql中动态生成CURSOR

我有一个光标,它指向一个SELECT,但这个选择是动态生成的.我想在声明后分配声明.我做了一个工作的例子,另一个例子不工作.这是仅打印一些数据的简单示例.这是表:

CREATE TABLE public.my_columns (
  id      serial NOT NULL,
  "name"  varchar(30) NOT NULL,
  /* Keys */
  CONSTRAINT my_columns_pkey
    PRIMARY KEY (id)
) WITH (
    OIDS = FALSE
  );

CREATE INDEX my_columns_index01
  ON public.my_columns
  ("name");


INSERT INTO public.my_columns
    ("name")
VALUES
    ('name1'),
    ('name2'),
    ('name3'),
    ('name4'),
    ('name5'),
    ('name6');
Run Code Online (Sandbox Code Playgroud)

这是函数(我已经把工作代码和代码不起作用):

CREATE OR REPLACE FUNCTION public.dynamic_table
(
)
RETURNS text AS $$
DECLARE
       v_sql_dynamic varchar;

       --NOT WORKING:
       --db_c CURSOR IS (v_sql_dynamic::varchar);

       --WORKING:
       db_c CURSOR IS (SELECT id, name from public.my_columns);

       db_rec RECORD;

BEGIN
     v_sql_dynamic := …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic plpgsql cursor

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

在PL \ pgSQL函数中使用几何?

我正在尝试使用PL \ pgSQL过程语言创建两个几何数据类型的函数,例如多点和多行字符串。我想为所有点选择30米距离内的所有线。这是我尝试过的:

Create OR Replace Function get_streets(bar.geom geometry foo.geom geometry)
Returns geometry AS $$
BEGIN
  IF ST_DWithin(bar.geom, foo.geom, 30.0) Then
    Return foo.geom;
  ELSE
    Return null;
  END IF
  Return foo.geom;
END;
$$ Language plpgsql;
Run Code Online (Sandbox Code Playgroud)

由于几何数据类型,该函数返回错误。在plpgsql函数中使用/处理几何数据有什么建议吗?

postgresql postgis plpgsql

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

EXECUTE的查询字符串参数为null

编辑

看来我的问题是当这个select语句返回null时(我正在尝试处理的情况 - 当它返回null时,我希望我的新值为-999).如果在找到null时出错,我怎么能这样做呢?

原版的

我已经阅读了有关此错误的所有其他SO帖子,但其中没有一个似乎解决了我的问题的根源.

错误非常简单 - 我的EXECUTE语句中的一个参数为null.大.但是,我在调用之前打印出构成我的EXECUTE语句的每个值,并且我可以清楚地看到没有值为null.

码:

CREATE FUNCTION inform_icrm_prob_flow_query(tablename text, location_id int,
                                            product_date_str text, lead_time_start int,
                                            lead_time_end int, first_member_id int,
                                            last_member_id int, dest_file text)
RETURNS void AS $$
DECLARE
  count int;
  product_date TIMESTAMPTZ;
  interval_lead_time_start text;
  interval_lead_time_end text;
  curr_value double precision;
  query text;
BEGIN
  product_date := product_date_str::TIMESTAMPTZ;
  count := first_member_id;
  curr_value := 0;

  interval_lead_time_start :=  ''''|| product_date ||'''::timestamptz +
                               interval '''||lead_time_start||' hours''';
  interval_lead_time_end :=  ''''|| product_date ||'''::timestamptz +
                             interval '''||lead_time_end||' hours'' -
                             interval ''6 hours''';

  --create our …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql psql

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

PostgreSQL在删除行之前创建触发器

所以我有这两个表:

 Table user
 columns: id,name,surname, password,token,earnedmoney


 Table addlisting
 columns: id, user_fk,price,date_added
Run Code Online (Sandbox Code Playgroud)

这是我的问题:我想创建一个触发器,以便当我从表addlisting中删除列表时,列表的价格被添加到表用户中的“ earnedmoney”列中。

有人可以帮我吗?谢谢!

postgresql triggers plpgsql stored-functions

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