标签: stored-functions

无法创建存储函数 - 语法错误?

我有以下问题.

我想创建一个存储函数,将entity_id转换为相应的sku

这是代码:

CREATE FUNCTION `id2sku`(`entity_id_in` INT)
    RETURNS VARCHAR
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    DECLARE returnvalue varchar(50);

    SELECT `sku` INTO returnvalue FROM catalog_product_entity WHERE entity_id = entity_id_in LIMIT 1;

    return returnvalue;
END
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,如果我触发查询,我收到以下消息:[窗口标题]错误

SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT' at line …
Run Code Online (Sandbox Code Playgroud)

mysql sql database stored-procedures stored-functions

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

ORACLE PL/SQL变量函数范围 - 需要说明

我刚刚找到一个问题的答案,我遇到的问题是PL/SQL变量没有被函数识别,我希望有人可以向我解释为什么我的解决方案有效以及发生了什么"在幕后".

背景

作为优化项目的一部分,我正在尝试收集存储过程中各个SQL脚本的度量标准.我正在解析的存储过程具有一个In-type日期参数,我需要定义它以运行每个单独的SQL脚本:

CREATE OR REPLACE myStoredProc (DATE_IN DATE, ERROR_OUT OUT VARCHAR2)
IS
BEGIN
    --Truncate Temp Tables
    --6 Individual SQL Scripts
EXCEPTION
    --Error Handling
END;
Run Code Online (Sandbox Code Playgroud)

为了单独运行每个脚本,我决定将每个SQL语句放入PL/SQL块并将DATE_IN参数作为变量提供:

DECLARE
    DATE_IN DATE := TO_DATE('16-JUL-2014','DD-MON-RR'); 
BEGIN
    --Place individual script here
END;
Run Code Online (Sandbox Code Playgroud)

问题

这种方法适用于引用此DATE_IN变量的几个查询,但是一个查询引用了外部函数,该函数DATE_IN作为参数开始抛出ORA-00904错误:

DECLARE  
    DATE_IN DATE := TO_DATE('16-JUL-2014','DD-MON-RR'); 
BEGIN
    insert into temp_table
    SELECT table1.field1,
           table1.field2,
           table2.fieldA,
           MyFunction(table1.field1, DATE_IN) --This was the problem line
      FROM
           table1,
           table2
     WHERE EXISTS (inner query)
       AND table1.keys = table2.keys
       AND table2.date <= DATE_IN …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql stored-procedures stored-functions

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

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

内联表值函数中 SELECT * 的性能

今天,工作中的首席 DBA 说我不应该使用 ITVF 来完全包装视图,但从我的基本基准来看,我对此表示怀疑。看起来 SQL Server 只是在查询时对它实际需要的列进行排序(基于函数的请求)。我这么说是因为我发现下面两个示例的执行时间非常相似。


uf_GetCustomersByCity_A

在此示例中,我创建了一个 ITVF,它执行 a 操作SELECT *,返回一个已过滤的CustomerView

CREATE FUNCTION [dbo].[uf_GetCustomersByCity_A] (@idCity INT)
RETURNS TABLE
AS RETURN

    SELECT CustView.*
      FROM [dbo].[CustomerView] CustView
     WHERE CustView.idCity = @idCity

GO
Run Code Online (Sandbox Code Playgroud)

uf_GetCustomersByCity_B

CREATE FUNCTION [dbo].[uf_GetCustomersByCity_B] (@idCity INT)
RETURNS TABLE
AS RETURN

    SELECT CustView.idCustomer
         , CustView.cFullName
         , CustView.cCityName
         , CustView.fBalance
      FROM [dbo].[CustomerView] CustView
     WHERE CustView.idCity = @idCity

GO
Run Code Online (Sandbox Code Playgroud)

我的问题是,这是否是一个有效的观察结果,或者只是长时间调试的副作用(假设 SQL Server 通过使用进行优化)。在视图中提供所需的所有内容而不是在 ITVF 中专门指定每一列具有很大的价值。

业余基准

因此,两者都工作得很好,在 4-5 秒内产量约为 500k 行(注意:有一些复杂的子句会导致漫长的执行时间,这些示例很难说明这里的目的)。该视图有大约 70 或 80 列,其中许多都是内联格式化或操作的。

-- …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server stored-functions set-returning-functions

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

Mysql 生成简单的存储函数

我已经奋斗了大约一个小时,试图让一个简单的存储函数在 mysql 中工作。我做了下面的简单例子,我不确定它有什么问题。

CREATE FUNCTION hello(id INT) 
RETURNS VARCHAR
BEGIN
    RETURN 'Works';
END;

hello(2);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在“BEGIN RETURN 'Works”附近使用的正确语法;END' 在第 3 行

我很确定这是一个“愚蠢”的问题,但我不是一个 sql 专家,并且迫切需要组合一组函数来构建自定义报告

mysql sql stored-procedures stored-functions

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