标签: functions

在 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万
查看次数

如何选择属于 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
查看次数

MS SQL Server 支持“功能索引”吗?

我在阅读 PostgreSQL 文档时刚刚遇到基于表达式的索引(又名“功能索引”)(我以前不知道此类索引)。

我只是想知道 Microsoft SQL Server 中是否有与此类似/等效的内容?我已阅读有关索引的 SQL Server 文档,但没有看到任何明显相似/等效的内容。

postgresql index sql-server functions

6
推荐指数
3
解决办法
2607
查看次数

在函数中无效使用副作用运算符“INSERT” - 在函数中多次插入

如果这不是正确的论坛,请让我知道并为我移动它。

我刚刚在标量函数的末尾有一堆这样的插入:

   INSERT INTO [Raptor].[dbo].[UserRole]
           ([RoleId]
           ,[UserId])
     VALUES
           (3
           ,@NewUserID)

    INSERT INTO [Raptor].[dbo].[UserRole]
               ([RoleId]
               ,[UserId])
         VALUES
               (5
               ,@NewUserID)
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql functions

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

为什么在 db2 查询中从十进制转换为字符时会得到前导零?

我有一个名为 length 的列定义为:

TYPE_NAME: DECIMAL 
DATA_TYPE: 3 
COLUMN_SIZE: 9 
BUFFER_LENGTH: 11
DECIMAL_DIGITS: 5 
NUM_PREC_RADIX: 10
Run Code Online (Sandbox Code Playgroud)

当我运行以下选择时:

select char(length) st_length, length from atable
Run Code Online (Sandbox Code Playgroud)

我在 st_length 列上得到前导零:

st_length   length
0043.00000  43.00000
0043.00000  43.00000
0045.00000  45.00000
0044.00000  44.00000
0044.00000  44.00000
0046.00000  46.00000
Run Code Online (Sandbox Code Playgroud)

为什么我得到前导零以及如何摆脱它们?


编辑:我本来想早点说的,但忘了。我正在使用 db2 v9.5.8 LUW。


解决方案:我最初的目标是获得长度最左边的字符。我结束了这个:

select left(char(cast(length as int)),1) st_length, length from atable 
Run Code Online (Sandbox Code Playgroud)

这产生了,

st_length  length
4          43.00000
4          43.00000
4          45.00000
4          44.00000
4          44.00000
4          46.00000
Run Code Online (Sandbox Code Playgroud)

欢迎改进。

db2 datatypes functions

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

为什么在 Oracle 中删除基于函数的索引需要很长时间?

我有一个基于函数的索引,在 9400 万行的表上创建需要 25 分钟。

当我删除索引时,需要 18 分钟。

为什么需要这么长时间?我会认为下降几乎是立即的?我注意到大约 10 分钟后,索引从 user_indexes 中删除,但脚本仍然执行了大约 8 分钟。

该表已分区,这是 Oracle 10g RAC 安装。如果有更多信息有帮助,我可以根据需要添加它。

对此的任何启发将不胜感激。

index oracle oracle-10g functions

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

如何将所有用户定义的函数保存到本地硬盘驱动器上的 txt 文件中?

我正在运行 SQL Server 2008 并且需要备份我创建的 UDF 脚本/查询。如何才能及时做到这一点?我尝试右键单击保存 UDF 的文件夹图标(表值函数)以复制文件夹,但不能打包到。

我唯一能想到的就是在我的 UDF 脚本上使用 MODIFY 命令,然后复制并粘贴到单独的文本文件中。

即使只有一种简单的方法可以将所有脚本保存在一个文本文件中而不是单独的 txt 文件中,我也很乐意这样做,而不必一次复制和粘贴每个文件。

有什么建议?

sql-server-2008 sql-server backup functions

5
推荐指数
3
解决办法
8753
查看次数