标签: functions

从函数返回带有列名的 ResultSet

我有以下 postgresql 函数:

CREATE OR REPLACE FUNCTION readMessage(messageFor INT, qid INT = NULL, ctxt INT = NULL, messageFrom INT = NULL, byTimeStamp BOOLEAN = FALSE)
RETURNS SETOF message
AS $$
DECLARE
    sql varchar;
BEGIN
    sql := 'SELECT * FROM message WHERE (receiver_id IS NULL OR receiver_id = $1)';
    IF qid IS NOT NULL THEN
        sql := sql || ' AND queue_id = $2';
    END IF;
    IF ctxt IS NOT NULL THEN
        sql := sql || ' AND context = $3'; …
Run Code Online (Sandbox Code Playgroud)

postgresql java functions postgresql-9.1

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

从 %current% 表中选择的 PostgreSQL 触发器函数

我有多个具有相同列名的表,它们仅在列值上有所不同,例如:

tbl_log_a
tbl_log_b
tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)

从 a 到 z 的 26 个表。每个表都有一个触发器,它调用一个触发器函数,它执行完全相同的操作:

SELECT columnname FROM tbl_log_a
Run Code Online (Sandbox Code Playgroud)

除此之外,我所有的触发器功能都做同样的事情。它们的不同之处在于:

select columnname FROM tbl_log_a
select columnname FROM tbl_log_b
select columnname FROM tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)

所以我必须创建 26 个触发函数,每个tbl_log_%letter%. 有没有办法告诉触发器函数:

SELECT columnname FROM %currenttable%
Run Code Online (Sandbox Code Playgroud)

通过%currenttable%我的意思是当触发放在桌子上。或者:

SELECT columnname FROM tbl_log_%letter%
Run Code Online (Sandbox Code Playgroud)

Postgres 9.1 中可能吗?我正在阅读动态确定的表。有什么线索吗?我想将表名本身存储在一个变量中,而不是该表中的列,因为触发器函数适用于该表中的多个列。

TG_TABLE_NAME
TG_TABLE_SCHEMA
Run Code Online (Sandbox Code Playgroud)

postgresql trigger dynamic-sql plpgsql functions

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

如何从性能的角度更好地使用 CLR 函数(在每个 DB 内部重复或具有通用功能)?

我问了一个关于XML使用XSD schemainside验证的问题SQL Server 2012(见链接)。我明白(正如我怀疑的那样)我需要使用CLR Function. 该函数将获取XSD schema textXML text进行验证。

我将有 1 个配置数据库和许多安装数据库。从那个角度来看,我想知道在哪里创建该功能 - 在配置数据库中还是在每个安装数据库中?

从支持的角度来看,最好只有一个 CLR 功能。

xml t-sql sql-server-2012 functions sql-clr

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

根据列值返回行数

我们正在为客户管理抽奖活动,其中我们有一个与参赛者和参赛者获得的参赛作品数量相关联的 GUID。我希望能够根据与参赛人数相对应的获胜机会来抽取获胜者。

GUID | Entries
--------------
1    | 1
2    | 5
3    | 2
4    | 7
Run Code Online (Sandbox Code Playgroud)

所以结果将是:

GUID
----
1
2
2
2
2
2
3
3
4
4
4
4
4
4
4
Run Code Online (Sandbox Code Playgroud)

基本上我计划将结果放在电子表格中,然后使用随机数生成器在 1 和 n 之间选择一个行号,其中 n 是条目的总数。但是,当然,如果有一种方法可以轻松地以编程方式选择获胜者,我会全神贯注(或视情况而定)。

提前致谢。

stored-procedures functions

7
推荐指数
2
解决办法
3072
查看次数

在 PostgreSQL 的触发器函数中使用新插入的值

我有这张表:

CREATE TABLE accounts (
  id BIGINT NOT NULL UNIQUE,
  balance INTEGER DEFAULT 0
);
Run Code Online (Sandbox Code Playgroud)

我需要在将行插入 2 个不同的表后更新每个用户的余额,transfers并且deposits.

我创建了 2 个函数来计算新用户余额并更新它:

/* function for getting user balance */
CREATE FUNCTION get_balance(bigint) RETURNS bigint
    AS 'SELECT (
  SELECT COALESCE(sum(CASE WHEN won THEN amount * (multiplier - 1) ELSE -amount END), 0)
  FROM transfers
  WHERE user_id = $1
) + (
  SELECT COALESCE(sum(amount), 0)
  FROM deposits
  WHERE user_id = $1
) as sum;'
    LANGUAGE SQL
    IMMUTABLE
    RETURNS NULL …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger functions

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

将 SQL 函数标记为 LEAKPROOF 是否有任何性能优势?

PostgreSQL 有一个属性LEAKRPOOF,你可以用它来声明一个函数,

LEAKPROOF表示该函数没有副作用。除了返回值外,它不显示有关其参数的任何信息。例如,对于某些参数值而不是其他参数值抛出错误消息的函数,或者在任何错误消息中包含参数值的函数都不是防漏的。这会影响系统对使用该security_barrier选项创建的视图或启用了行级安全性的表执行查询的方式。系统将在用户提供的包含非防漏功能的查询本身的任何条件之前强制执行安全策略和安全屏障视图中的条件,以防止数据意外暴露。标记为防漏的函数和操作符被认为是可信的,并且可以在安全策略和安全屏障视图的条件之前执行。

文件继续说,

查询计划器在处理没有副作用的函数时具有更大的灵活性。此类函数称为LEAKPROOF,并且包括许多简单、常用的运算符,例如许多相等运算符。查询规划器可以安全地允许在查询执行过程中的任何点评估此类函数,因为在用户不可见的行上调用它们不会泄漏有关不可见行的任何信息。此外,不接受参数或未从安全屏障视图传递任何参数的函数不必标记为LEAKPROOF被推下,因为它们永远不会从视图接收数据。相比之下,根据作为参数接收到的值可能抛出错误的函数(例如在溢出或被零除时抛出错误的函数)不是防漏的,并且可以提供关于看不见的行的重要信息如果在安全视图的行过滤器之前应用。

是下面的LEAKRPOOF函数

CREATE FUNCTION foo_leakproof(bar int)
RETURNS int AS $$
  SELECT bar;
$$
IMMUTABLE LEAKPROOF
LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

曾经有过不同的计划,或者它是否使用与LEAKPROOF缺乏替代方案不同的运行时配置文件运行,

CREATE FUNCTION foo_leaky(bar int)
RETURNS int AS $$
  SELECT bar;
$$
IMMUTABLE
LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

postgresql performance functions

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

如何选择属于 PostgreSQL 中给定扩展的函数?

我正在尝试编写一个SELECT从中pg_catalog提取函数名称、其架构名称和创建该函数的扩展名的函数。

拉取我使用的函数列表(简化版本)

SELECT pg_proc.proname, pg_namespace.nspname AS proschema
FROM pg_proc
    INNER JOIN pg_namespace ON (pg_namespace.oid = pg_proc.pronamespace)
Run Code Online (Sandbox Code Playgroud)

要选择我可以运行的扩展

SELECT pg_extension.extname, pg_namespace.nspname as extschema
FROM pg_catalog.pg_extension
    INNER JOIN pg_catalog.pg_namespace ON (pg_namespace.oid = pg_extension.extnamespace)
Run Code Online (Sandbox Code Playgroud)

现在我正在寻找它们在“”时创建的扩展和函数之间的链接CREATE EXTENSION。理想情况下,SELECT 应该生成 extension_name、extension_schema、foo_name、foo_schema 的列表

postgresql functions postgresql-extensions

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

在函数中使用链接服务器时选择权限被拒绝,除非内联关闭

升级到 SQL Server 2019 后,我们在 beta 环境中遇到异常错误。从标量值函数中进行选择时会发生这种情况。在我们运行 SQL 2014 的生产环境中不会发生此错误。

声明是:

select function(1234567)
Run Code Online (Sandbox Code Playgroud)

错误信息是:

消息 229,级别 14,状态 5,第 1 行
对象“函数”、数据库“数据库”、架构“dbo”的 SELECT 权限被拒绝。

功能是:

CREATE FUNCTION [dbo].[function](@var1 INT)
RETURNS BIT
BEGIN
    DECLARE @var2 BIT, @var3 BIGINT, var4 INT
    SET @var2 = 0

    SELECT @var3= ISNULL(tbl2.field1,tbl3.field1) FROM tbl1 
    LEFT OUTER JOIN tbl2 WITH (NOLOCK) ON tbl2.field2 = tbl1.field2 
    LEFT OUTER JOIN tbl3 WITH (NOLOCK) ON tbl3.field2 = tbl1.field2
    WHERE tbl1.field2 = @var1

    SELECT @var4 = ISNULL(field4,1) FROM linked_server.database.dbo.tbl4 WHERE field5=Convert(VARCHAR(20),@var3)
    IF(@var4 …
Run Code Online (Sandbox Code Playgroud)

sql-server permissions functions sql-server-2019

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

我怎样才能消除这个标量函数或让它更快?

我正在处理相当长的视图,其中一个 SQL 语句调用了标量函数,这确实降低了性能。以下是在 select 语句中调用的函数。(SQL Server 2016)

真的不确定修改这个过程的最佳方法。

简化的选择语句。

Select vendorpartid, 
dbo.ufn_StockUomQuantityToOrder(vpp.priorityLevel, vpp.monthlyUsageRate, vpp.minimumPurchaseUomOrderQuantity, vpp.purchaseUomConversionFactor, vpp.orderFrequencyDays, vpp.boxQuantity) stockUomQuantityToOrder
FROM vendorpartpriority vpp


ALTER FUNCTION [dbo].[ufn_StockUomQuantityToOrder] (
            @priorityLevel decimal(38, 10),
            @monthlyUsageRate decimal(38,10),
            @minimumPurchaseUomOrderQuantity decimal(38, 10),
            @purchaseUomConversion decimal(38, 10),
            @orderFrequencyDays decimal(38,10),
            @boxQuantity int
        )  
        RETURNS int
        WITH SCHEMABINDING
        AS   
        -- Calculate the quantity that needs to be ordered  
        BEGIN  
            DECLARE @quantityToOrderDecimal decimal(38, 10) = NULL;
            DECLARE @quantityToOrderInt int = NULL;
            DECLARE @orderFrequencyMinimumQuantity decimal(38, 10) = NULL;
            DECLARE @minimumStockUomOrderQuantity decimal(38,10) = NULL;
            
            --set the …
Run Code Online (Sandbox Code Playgroud)

sql-server functions

6
推荐指数
2
解决办法
1184
查看次数

视图与函数来获取表的顶部记录?

我正在和一位同事讨论解决问题的方法。

我们有一个表来跟踪填充过程,该表在列Lot和上具有唯一的索引列(或至少应该) TestGrade

最近,我们添加了逻辑,以便当TestGrade创建大于 1 的任何值时,所有较低级别都会被创建。完成了一些逻辑,因此较低级别的行不一定与顶层相同。

例如,我插入一些东西Lot='ABCD'TestGrade=5然后在我的Fills表中我看到

id    Lot    TestGrade   OtherColumns
======================================
10    'ABCD'     1          blah3
9     'ABCD'     2          bar
8     'ABCD'     3          foo
7     'ABCD'     4          blah1
6     'ABCD'     5          blah
Run Code Online (Sandbox Code Playgroud)

现在的问题是在许多情况下,我只想要 Fills 表的顶级记录,因此在示例中,我只想要带有id=6.

关于如何做到这一点,我们有两个想法。我想做一个看起来像

CREATE VIEW [dbo].[vwFills]
AS
SELECT t.* FROM [dbo].[Fills] t
JOIN (SELECT [Lot], MAX(TestGrade) as TestGrade FROM dbo.Fills GROUP BY [Lot]) t2 ON t.[Lot] = t2.[Lot] AND t.[TestGrade] = t2.[TestGrade]
Run Code Online (Sandbox Code Playgroud)

我的同事想做类似的事情,但在一个看起来像这样的函数内

ALTER …
Run Code Online (Sandbox Code Playgroud)

sql-server view functions

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