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 / 问题

问题[functions](dba)

Martin Hope
Biller Builder
Asked: 2022-09-28 09:00:57 +0800 CST

如何在 SQL 函数的复合类型参数上运行“SELECT”?

  • 1

示例:https ://dbfiddle.uk/bCSwVpd9

数据库:

CREATE TABLE entities (
  id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY
);

CREATE TYPE entity_id AS (
  id bigint
);

功能:

CREATE FUNCTION get_entities (
  pagination_limit bigint DEFAULT 25,
  pagination_offset bigint DEFAULT 0,
  entity_ids entity_id DEFAULT NULL
)
RETURNS TABLE (
  id bigint
)
LANGUAGE SQL
AS $BODY$
  WITH input_entities AS (
    SELECT
      id
    FROM
      entities
    WHERE
      -- filter by id list if provided
      entity_ids IS NULL OR id IN (
        SELECT
          id
        FROM
          entity_ids
      )
    ORDER BY
      id ASC
    LIMIT pagination_limit
    OFFSET pagination_offset
  )
  SELECT
    id
  FROM
    input_entities
  ORDER BY
    id
$BODY$;

关键是我想编写一个分页多选函数,它可以从分页信息和一组 ID 中工作。它上面的函数的问题崩溃了:

ERROR:  relation "entity_ids" does not exist
LINE 22:           entity_ids

对这个问题也有类似的反应:first,second。但是,它们围绕作为标识符字符串的参数,而不是复合记录类型和 use plpgsql,这可能不重要,也可能不重要。

postgresql functions
  • 1 个回答
  • 44 Views
Martin Hope
Nan0
Asked: 2022-09-19 23:59:38 +0800 CST

来自双矩阵的 0 和 1

  • 2

我需要用 0 和 1 组合制作一个矩阵:

SELECT 1 AS F1, 0 AS F2 ,0 AS F3,0 AS F4, 0 AS F5 FROM DUAL
UNION ALL
SELECT 0 AS F1, 1 AS F2 ,0 AS F3,0 AS F4, 0 AS F5 FROM DUAL
UNION ALL
SELECT 0 AS F1, 0 AS F2 ,1 AS F3,0 AS F4, 0 AS F5 FROM DUAL
UNION ALL
SELECT 0 AS F1, 0 AS F2 ,0 AS F3,1 AS F4, 0 AS F5 FROM DUAL
UNION ALL
SELECT 0 AS F1, 0 AS F2 ,0 AS F3,0 AS F4, 1 AS F5 FROM DUAL

您是否有一些更棘手或更优雅的代码来实现这一目标?

我在 Oracle 19c

谢谢

oracle functions
  • 2 个回答
  • 173 Views
Martin Hope
Alex Tbk
Asked: 2022-09-17 22:24:11 +0800 CST

Postgres 11 将 uuid 列表传递给函数

  • 0

我试图创建一个接受 uuid 列表作为参数的函数。

我的代码:

create or replace function get_child_groups(input_parents_id uuid[])
returns table(id uuid, name text, parent_id uuid)
as
$$
WITH RECURSIVE c AS (
    SELECT da.*
      from device_group_v2 d
               JOIN device_group_associations da on da.parent_id = d.id
      where d.id in (input_parents_id)

      UNION ALL

      SELECT sa.*
      FROM device_group_associations AS sa JOIN c ON c.child_id = sa.parent_id)
select * from(select d.* from c join device_group_v2 d on c.parent_id = d.id OR c.child_id = d.id) as x
union
select * from device_group_v2 where id in (input_parents_id)
$$ language sql;

这失败了:

[42883] 错误:运算符不存在:uuid = uuid[] 没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。职位:290

我究竟做错了什么?那里需要一种类型转换吗?

postgresql functions
  • 2 个回答
  • 34 Views
Martin Hope
Pragy Agarwal
Asked: 2022-07-31 12:34:59 +0800 CST

如何将当前行传递给 Postgres 中的 Generated Column 函数?

  • 4

Postgres 12+ 支持生成的列:https ://www.postgresql.org/docs/current/ddl-generated-columns.html

从文档来看,语法似乎是有限的——它强制人们显式地命名生成列所依赖的列。

CREATE TABLE people (
    ...,
    height_cm numeric,
    height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
);

有没有办法将整行传递给生成函数?就像是

CREATE TABLE people (
    ...,
    height_cm numeric,
    height_in numeric GENERATED ALWAYS AS generator_function(current_row) STORED
);
postgresql functions
  • 1 个回答
  • 175 Views
Martin Hope
machineghost
Asked: 2022-07-11 16:55:57 +0800 CST

如何基于 SELECT 编写 Postgres “if”?

  • 0

如果我在 PostgreSQL 中有一个函数,我可以username像这样验证它的参数(例如一个参数):

IF LENGTH(username) < 4 THEN
    RAISE EXCEPTION 'Usernames must contain at least four characters';
END IF;

我想不通的是如何对 SELECT 查询的结果做同样的事情,即。就像是:

IF LENGTH(SELECT * FROM USERS WHERE username=username) > 1 THEN
    RAISE EXCEPTION 'Username already exists';
END IF;

(是的,我知道 PostgreSQL 会在没有那行的情况下给我一个错误,但我想要一个更友好的错误消息。)

在(Postgre)SQL中是否可能出现类似的情况,如果可以,有人可以指出我可以查看的语法(或它的示例)吗?

postgresql functions
  • 1 个回答
  • 20 Views
Martin Hope
king_of_limes
Asked: 2022-04-16 00:02:55 +0800 CST

将几张大表拆分成多张,避免空表

  • 1

我正在重组和统一 PostgreSQL 中的大型数据库。其中一部分是根据它们在“键”中的值将一些大表拆分为较小的表。我为此编写的函数运行良好,如下所示:

CREATE OR REPLACE FUNCTION split_tables (table_string varchar(100)) RETURNS void AS
$$
DECLARE
r_row record;

BEGIN
FOR r_row IN SELECT type FROM type_list
LOOP
EXECUTE 'CREATE TABLE public.id_' || table_string || '__' || r_row.type || ' AS (SELECT * FROM id_'
|| table_string || ' WHERE lower(id_' || table_string || '.key) = lower(''' || r_row.type || '''));';
END LOOP;
END;
$$
LANGUAGE plpsql;

因此,这将遍历 type_list 中的所有条目并为每种类型创建表。要对所有需要拆分的表执行此操作,我将此函数称为 SELECT tobesplit.id FROM tobesplit, LATERAL split_tables(tobseplit.id);

但是,这会为 type_list 中的所有条目创建表,即使表中没有要为某些类型拆分的条目。所以最后,我创建了一大堆我不需要的空表。我寻找了仅在结果不为空时才创建表的方法,并在以下答案中找到了可能的解决方案:CREATE TABLE IF ONLY NOT EMPTY RESULT SET。

如果我单独测试它,这会起作用,但我不知道如何将它合并到执行语句中。一旦我将 IF 或 CASE 子句写入 EXECUTE 语句,我总是会遇到语法错误。

我很感谢任何想法:)

postgresql functions
  • 1 个回答
  • 160 Views
Martin Hope
User1974
Asked: 2022-03-29 10:25:32 +0800 CST

使用内联函数获取查询的解释计划

  • 1

我有一个具有内联函数的查询:

with function with_f(p_text in varchar2) return varchar2 is
  begin
    return p_text;
  end;
select with_f(dummy) from dual

有没有办法在 SQL Developer 中获取该查询的解释计划?

我试过这个:

explain plan for (
with function with_f(p_text in varchar2) return varchar2 is
  begin
    return p_text;
  end;
select with_f(dummy) from dual
); 
select plan_table_output from table(dbms_xplan.display());

但我收到以下错误:

SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"
oracle functions
  • 1 个回答
  • 37 Views
Martin Hope
Ουιλιαμ Αρκευα
Asked: 2022-03-21 17:51:24 +0800 CST

从函数返回带有时区的时间戳时丢失时区

  • 0

我有这个功能:

CREATE OR REPLACE FUNCTION laborable_day(dtDateTime TIMESTAMP WITH TIME ZONE) 
RETURNS TIMESTAMP WITH TIME ZONE AS $$
DECLARE
  _isHoliday BOOLEAN;
BEGIN
  LOOP
    SELECT COUNT(*) > 0 INTO _isHoliday 
    FROM holidays 
    WHERE holiday = DATE(dtDateTime);
    
    IF _isHoliday THEN
      dtDateTime := dtDateTime + INTERVAL '1 DAY';
    ELSE
      EXIT;
    END IF;
  END LOOP;
  RETURN dtDateTime;
END;
$$ LANGUAGE plpgsql STRICT SECURITY DEFINER;

如果我运行这个命令:

select laborable_day('2022-01-01 18:53:11.14297-05'::TIMESTAMPTZ);

我得到:

+------------------------------+
| laborable_day                |
|------------------------------|
| 2022-01-02 23:53:11.14297+00 |
+------------------------------+
SELECT 1
Time: 0.012s

为什么时区信息会丢失?

postgresql functions
  • 1 个回答
  • 377 Views
Martin Hope
Random Person
Asked: 2022-03-21 02:18:56 +0800 CST

如何在 MySQL 中查找输出的数据类型?

  • 1

我正在阅读有关CONCAT()函数的信息,我注意到了这一点:

mysql> SELECT CONCAT(14.3);
        -> '14.3'

在 MySQL 8.0 命令行客户端中运行此命令时,输出没有引号。所以我想验证输出的数据类型(我假设它是字符串数据类型)。请帮我找到输出的数据类型。

mysql functions
  • 2 个回答
  • 115 Views
Martin Hope
Nir
Asked: 2022-02-10 23:39:33 +0800 CST

NVL 的 Postgres 函数

  • 1

我正在尝试NVL在 postgres 中使用。

create or replace function nvl (anyelement, anyelement)
returns anyelement language sql as $$
    select coalesce(cast( $1 as decimal), cast( $2 as decimal))
$$;

但是,对于以下示例,这对我来说失败了:

testdb=> select nvl(1,2);
ERROR:  return type mismatch in function declared to return integer
DETAIL:  Actual return type is numeric.
CONTEXT:  SQL function "nvl" during inlining

testdb=> SELECT nvl( sum(balance), 0 ) as b FROM db.bank WHERE user = 123;
ERROR:  function nvl(numeric, integer) does not exist
LINE 1: SELECT nvl( sum(balance), 0 ) as b FROM db.bank...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

当我将其更改为:

create or replace function nvl (anyelement, anyelement)
returns anyelement language sql as $$
    select case when $1 is null then $2 else $1 END 
$$;

第一个例子有效。但我仍然有失败:

testdb=> SELECT nvl( sum(balance), 0 ) as b FROM db.bank WHERE user = 123;
ERROR:  function nvl(numeric, integer) does not exist
LINE 1: SELECT nvl( sum(balance), 0 ) as b FROM db.bank...
       

希望得到一些帮助来解决这个问题。

postgresql functions
  • 1 个回答
  • 3689 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