我有以下问题.
我想创建一个存储函数,将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) 我刚刚找到一个问题的答案,我遇到的问题是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) 所以我有这两个表:
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”列中。
有人可以帮我吗?谢谢!
今天,工作中的首席 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_BCREATE 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) 我已经奋斗了大约一个小时,试图让一个简单的存储函数在 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 专家,并且迫切需要组合一组函数来构建自定义报告
sql ×3
mysql ×2
database ×1
oracle ×1
plpgsql ×1
plsql ×1
postgresql ×1
sql-server ×1
t-sql ×1
triggers ×1