AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[plpgsql](dba)

Martin Hope
user3040157
Asked: 2022-10-22 00:15:31 +0800 CST

如何在文本列中插入“C:\”,PL/pgSQL

  • 5

我目前在我的 PL/pgSQL 查询中遇到一个奇怪的问题,即在文本列中插入字符串,我将解释:

我有一个具有以下架构的表:

CREATE TABLE IF NOT EXISTS Loading_Info
            (
                ID SERIAL PRIMARY KEY ,
                Vendor_Loc VARCHAR(500),
                Dest_Loc VARCHAR(500)
);

该表将包含用于数据加载的文件位置。

我的插入查询如下:

INSERT INTO Loading_Info
    (
      ID,
      Vendor_Loc,
      Dest_Loc
    )
    VALUES
    (
      '1',
      's3://ind-uat-ics/uat/telco/',
      'C:\ind-uat-ics\uat\telco\'
    );

    COMMIT;

当我尝试在 SQL 工作台上执行此查询时,出现以下错误:

[Amazon](500310) Invalid operation: unterminated quoted string at or near "'C:\ind-uat-ics\uat\telco\',
        )"

您知道如何插入这些字符以被视为字符串吗?

plpgsql
  • 1 个回答
  • 23 Views
Martin Hope
beehive
Asked: 2022-05-10 09:26:59 +0800 CST

postgresql 触发器 --> 触发器函数 --> 子触发器函数链

  • 0

我有一个复杂的触发功能,我希望将其分解为多个子功能。触发器将调用主函数,而主函数中将包含逻辑来决定调用哪个子函数。这是据我所知:

create table dbo.thing (thingid int);
create table dbo.thingtwo (thingid int);

create or replace function dbo.tf2(thingid int) returns void as $$
    insert into dbo.thingtwo values (thingid);
$$ language sql; 

create or replace function dbo.tf1() returns trigger as $thinginsert$
begin    
    perform dbo.tf2(new.thingid);
    return null;
end;
$thinginsert$ language plpgsql; 

create trigger thinginsert
after insert on dbo.thing
for each row execute procedure dbo.tf1();

问题是我想将整个传递给new.*第二个触发函数,而不仅仅是一些列。最终会有条件逻辑dbo.tf1()来决定是否去dbo.tf2()等等dbo.tf3()。

我怎样才能使这项工作?


我正在使用 Postgres 12.8。

postgresql plpgsql
  • 1 个回答
  • 32 Views
Martin Hope
igelr
Asked: 2021-12-27 11:49:29 +0800 CST

PostgreSQL:如何在游标脚本中切换数据库

  • 0

我想为 postgresql 10 编写函数,以授予指定用户对所有数据库的只读访问权限(应该从超级用户运行)

但是我在数据库切换部分有困难。我尝试在游标内切换数据库,但出现我无法理解的错误。如何更正我的脚本?

上下文:执行时的 PL/pgSQL 函数 inline_code_block

DO $$
DECLARE query text;

cursor cursor
FOR
SELECT '\c '||datname ||';'  from pg_database;
BEGIN
OPEN cursor;
LOOP
    FETCH cursor INTO query;
    EXIT WHEN NOT FOUND;
    
    --raise notice 'Value: %',query;
    EXECUTE query;
END LOOP;
CLOSE cursor;
END $$;
postgresql plpgsql
  • 1 个回答
  • 621 Views
Martin Hope
Héctor
Asked: 2021-09-25 05:46:09 +0800 CST

从表中一一选择行,将一列值与数组中的值进行比较

  • 1

我在 PLPGSQL 代码块中有一组时间戳:timestamp_array.

对于每个元素,timestamp_array我想获取元素本身 ( timestamp_element) 和表 () 中的一些列,该表my_table也具有时间戳列,但我不想获取表时间戳列本身,而是时间戳数组元素。条件是我只想为每个数组元素获取一个表行,即数组中的时间戳元素与表时间戳列之间最接近的匹配(到过去)。

我想要实现的是:

FOR EACH timestamp_element IN ARRAY timestamp_array
LOOP
  EXECUTE $EXE$
    SELECT my_table.some_other_columns...
    FROM my_table
    WHERE my_table.timestamp <= $1
    ORDER BY my_table.timestamp DESC
    LIMIT 1
  $EXE$
  USING timestamp_element
  INTO tmp_array;

  EXECUTE
    INSERT INTO temporary_table
    VALUES ($1, array_to_string($2, ', '))
  USING timestamp_element, tmp_array;
END LOOP;

我不知道前面的代码是否 100% 正确,但这只是为了更好地解释我想要实现的目标。显然,重点是只用一个查询来完成这项工作,而不是用一个查询数组元素。

如果我有一个实际案例my_table:

时间戳 可乐 ...
2020-02-13 23:12:07 12 ...
2020-03-27 10:37:01 15 ...
2020-06-14 16:32:44 7 ...
2020-06-14 17:01:57 33 ...

有一个timestamp_array:

[
  2020-02-15 12:00:00,
  2020-03-22 00:00:00,
  2020-06-14 17:00:00
]

我想要以下内容temporary_table,而不对每个数组元素使用一个独立的查询:

时间戳 可乐 ...
2020-02-15 12:00:00 12 ...
2020-03-22 00:00:00 12 ...
2020-06-14 17:00:00 7 ...
postgresql plpgsql
  • 1 个回答
  • 1457 Views
Martin Hope
guillermo_dangelo
Asked: 2021-09-09 07:03:02 +0800 CST

在 Postgres 的 FORMAT() 函数中转义 %

  • 2

我试图在 PostgreSQL 的 format() 函数中转义一个 '%' 字符。该函数根据列列表替换列值,删除返回 (\n) 并修剪字符串。

CREATE OR REPLACE FUNCTION eliminar_retornos(text) RETURNS VOID
AS $$
        declare
            i text;
            fields text[] := ARRAY['direccion', 'localidad', 'calle', 'esq1', 'esq2', 'obs'];
        BEGIN
            FOREACH i IN ARRAY fields
            loop
                EXECUTE format(
                    'update %1$s set %2$s = trim(upper(replace(%2$s, E''\n'', '' '')))', $1, i)
                ;
            END LOOP;
        RAISE NOTICE 'Se actualizó la capa %', $1;
        END
        ;
$$ LANGUAGE plpgsql;

我想改变这个函数,只替换那些有返回的字符串,使用类似的东西;

'update %1$s set %2$s = trim(upper(replace(%2$s, E''\n'', '' ''))) where %2$s LIKE E''%\n%''', $1, i) 

问题是我不知道如何正确转义 format() 函数中“LIKE”的“%”。

很抱歉发布了一些不可复制的东西,我的知识仅限于实现这一点。

postgresql plpgsql
  • 1 个回答
  • 1022 Views
Martin Hope
Adam Mulla
Asked: 2021-08-04 06:23:09 +0800 CST

如何使用用户定义的异常 - PostgreSQL 函数

  • 1

您能否提供在 PostgreSQL 函数中使用用户定义异常的语法?

假设我想处理以下用户定义的异常。

SQL Error [22023]: ERROR: password is too short.

有多个 SQLSTATE 错误代码,但无法找到此错误的 SQLSTATE 代码。我在上面使用的是 22023 但没有解决。

我们有以下代码,我们能够管理唯一的违规相关异常,但无法管理“密码太短”。你能帮我语法吗?

代码:

begin
EXECUTE 'ALTER USER ' || $1 || ' WITH PASSWORD '''|| $2||'''' ;
        EXCEPTION WHEN "Password is too short" 
        THEN RAISE DETAIL 'Please check your password';
        
INSERT INTO pwdhistory (usename,password,changed_on) values($1,md5($2),now());
        EXCEPTION WHEN unique_violation 
        THEN RAISE DETAIL 'Password already used earlier. Please try again with another password.';

end;
postgresql plpgsql
  • 1 个回答
  • 1053 Views
Martin Hope
geeko
Asked: 2021-05-16 12:58:56 +0800 CST

定义递归复合类型

  • 0

是否可以在 Postgres 13 中定义递归复合类型?

create type "t" as (
  "a" int,
  "b" t
);

我知道我可以使用具有父子关系的表。唯一的缺点是我需要查询每个嵌套级别,而不是直接访问嵌套数据。

我也知道我可以使用jsonb,但我不确定它是否可以直接访问嵌套数据而不查询每个嵌套级别?

仅使用 PL/pgSQL 的其他替代方案是什么?

我需要分别访问每个嵌套级别。

postgresql plpgsql
  • 1 个回答
  • 141 Views
Martin Hope
user229251
Asked: 2021-05-07 02:26:36 +0800 CST

触发以防止列值从 A 到 B,以及从 B 到 A

  • 0

我正在尝试创建一个触发器,以防止列更新如下:

如果列值为“A”,则无法更新为“B”,如果列值为“B”,则无法更新为“A”。

CREATE OR REPLACE FUNCTION cancelled_order()
    RETURNS trigger
    LANGUAGE plpgsql
AS $function$BEGIN
    IF OLD.status = 'Cancelled' THEN NEW.status != 'Accomplished';
    END IF;
    IF OLD.status = 'Accomplished' THEN NEW.status != 'Cancelled';
    END IF;
    RETURN NEW;
END;
$function$;

CREATE TRIGGER No_cancelled_acomplished
    BEFORE UPDATE OF status
    ON clinical.tb_orders
    EXECUTE PROCEDURE cancelled_order();

出现的错误是:

Sintaxis error: != 

有什么想法,为什么?

postgresql plpgsql
  • 1 个回答
  • 39 Views
Martin Hope
pricha
Asked: 2021-03-26 12:15:35 +0800 CST

如何创建聚合以查找整数列的最小值和最大值并以文本格式返回输出?

  • 1

我有一个函数,我在其中指定表和列,但我需要一个可以用于任何表和列的聚合以获得类似的输出

create function min_max_val()
returns text
 LANGUAGE plpgsql
 AS $$
  declare
  mmv text;
  begin
  select format('%s - %s',min(id),max(id) )min_max_vals into mmv from towns;
  return mmv;
 end;
$$ ;

    min_max_vals
---------------------
 1000001 - 11000000
postgresql plpgsql
  • 1 个回答
  • 126 Views
Martin Hope
Hedi Hadhri
Asked: 2021-03-13 23:35:36 +0800 CST

postgres函数的问题

  • 0

我编写了以下函数来从我作为参数提供的表和列中查询数据:

create or replace function field_summaries(gap interval , _tbl anyelement, _col text)                                
 returns SETOF anyelement as 
 $func$   
 BEGIN
 RETURN QUERY EXECUTE
 'select                                                                                                                       
 time_bucket(' || gap || ', time)::text as hour,                                                                                      
 avg(' || _col ||'),                                                                                                          
 min(' || _col ||'),                                                                                                          
 max(' || _col ||')                                                                                                         
 from ' || pg_typeof(_tbl) || ' d                                                                                                         
 where d.device_id in (                                                                                                       
     select device_id from sensors)                                                                                           
     group by hour';
 END
 $func$ language sql stable;  

问题是当调用这样的函数时:

select field_summaries('5minutes', NULL:: m_13, 'temperature');   

我收到以下错误:

ERROR:  syntax error at or near ":"  
LINE 2:  time_bucket(00:05:00, time)::text as hour,                 ...                                                                           
                       ^                                                                                                   
QUERY:  select                                                                                                                                                                                                                                         
time_bucket(00:05:00, time)::text as hour,                                                                                                                                                                                                            
avg(temperature),                                                                                                                                                                                                                                     
min(temperature),                                                                                                                                                                                                                                     
max(temperature)                                                                                                           
from m_13 d                                                                                                                
where d.device_id in (                                                                                                                                                                                                                                    
select device_id from sensors)                                                                                                                                                                                                                        
group by hour                                                                                                         
CONTEXT:  PL/pgSQL function field_summaries(interval,anyelement,text) line 3 at RETURN QUERY

有谁知道这可能是什么?

postgresql plpgsql
  • 2 个回答
  • 135 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve