什么是强制MySQL在存储过程中抛出错误的机制?
我有一个调用另一个函数的过程:
PREPARE my_cmd FROM @jobcommand;
EXECUTE my_cmd;
DEALLOCATE PREPARE my_cmd;
Run Code Online (Sandbox Code Playgroud)
job命令是:
jobq.exec("Select 1;wfdlk# to simulatte an error");
Run Code Online (Sandbox Code Playgroud)
然后:
CREATE PROCEDURE jobq.`exec`(jobID VARCHAR(128),cmd TEXT)
BEGIN
DECLARE result INT DEFAULT 0;
SELECT sys_exec( CONCAT('echo ',cmd,' | base64 -d > ', '/tmp/jobq.',jobID,'.sh ; bash /tmp/jobq.',jobID,'.sh &> /tmp/jobq.',jobID)) INTO result;
IF result>0 THEN
# call raise_mysql_error(result);
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
我的职业.exec总是成功的.有没有办法引发错误?如何实现raise_mysql_error函数?
顺便说一下,我使用的是MySQL 5.5.8
谢谢阿曼.
好的,所以我阅读了一大堆文章,建议表值函数和交叉应用提供比标量udf更好的性能.我想以两种方式编写我的函数,然后测试哪一个更好 - 但我无法弄清楚我应该使用/寻找什么是更好的选择.
我正在使用SQL Server 2005.我已经尝试在数据库引擎优化顾问中运行估计的执行计划,实际执行计划和分析查询,我不知道它试图告诉我什么.
使用showplan_all打开/关闭它看起来像基于表的函数将使用更多的CPU 1.157e-06与8.3e-05,但表函数的总子树成本为0.000830157对比0.01983356.
表值函数的查询成本似乎也比标量函数具有更高的成本.即使我认为它应该是更好的选择.
因此,虽然我想自己证明哪一个提供了更好的性能 - 我只是不确定在这些工具中寻找什么 - 所以任何建议都将受到赞赏!
我需要根据日历日期获得学年值(基于数据库中设置的日期范围),因此函数内容低于 - 所以它只是我是基于标量还是基于表.今年提供给其他查询..
CREATE FUNCTION fn_AcademicYear
(
-- Add the parameters for the function here
@StartDate DateTime
)
RETURNS
@AcademicYear TABLE
(
AcademicYear int
)
AS
BEGIN
DECLARE @YearOffset int, @AcademicStartDate DateTime
-- Lookup Academic Year Starting Date
SELECT @AcademicStartDate = CONVERT(DateTime,[Value])
FROM dbo.SystemSetting
WHERE [Key] = 'AcademicYear.StartDate'
SET @YearOffset = DATEPART(YYYY,@StartDate) - DATEPART(YYYY,@AcademicStartDate);
-- try setting academic looking start date to year of the date …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个mysql存储过程.我已使用以下代码成功创建了一个过程:
delimiter $$
CREATE PROCEDURE `myprocedure` (IN
var1 DATE)
BEGIN
<---code-->
END
Run Code Online (Sandbox Code Playgroud)
和
SHOW CREATE PROCEDURE myprocedure
Run Code Online (Sandbox Code Playgroud)
向我展示了我创建的程序.
但是Call myprocedure(2011-05-31);
向我显示以下错误
#1305 - PROCEDURE db.myprocedure does not exist
Run Code Online (Sandbox Code Playgroud)
db是我创建过程的数据库
我做错了什么?
任何人都可以帮助我吗?
在SQL SELECT语句中,我想执行一个对该SELECT语句范围具有确定性的函数(或者事务也可以):
select t.x, t.y, my_function(t.x) from t
Run Code Online (Sandbox Code Playgroud)
许多值t.x都是相同的,因此Oracle可以省略一次又一次地调用相同的函数,以加快速度.但是如果我将函数标记为DETERMINISTIC,则可以在此查询的多次执行之间缓存结果.我无法使用的原因DETERMINISTIC是因为my_function使用了不时更改的配置参数.
我可以使用其他任何关键字吗?是否有任何我应该注意的问题(内存问题,并发性等)?或者也许任何其他技巧,例如分析函数,每个t.x值只调用一次函数(没有重大的性能影响)?
我正在尝试创建一个递归构建特定类别路径的函数
CREATE FUNCTION getPath(inId INT)
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE return_path TEXT;
DECLARE return_parent_id INT;
SELECT CONCAT('/', name) INTO return_path FROM article_categories WHERE id = inId;
SELECT parent_id INTO return_parent_id FROM article_categories WHERE id = inId;
IF return_parent_id > 0 THEN
SELECT CONCAT(getPath(return_parent_id), return_path) INTO return_path;
END IF;
RETURN return_path;
END
Run Code Online (Sandbox Code Playgroud)
当我尝试使用没有父项的类别(parent_id = 0)运行此函数时,它工作正常,但是当我尝试一个parent_id> 0的类别时,我得到1424递归存储函数和触发器是不允许的.
我该如何解决这个问题?我将在常规的Web托管服务上托管此代码,该服务至少应该具有MySQL服务器版本5.1.
在Ike Walker的帮助下,我做了一个很好的工作
DROP PROCEDURE IF EXISTS getPath;
DELIMITER //
CREATE PROCEDURE getPath(IN category_id INT UNSIGNED, OUT return_path TEXT)
BEGIN
DECLARE parent_id INT UNSIGNED;
DECLARE …Run Code Online (Sandbox Code Playgroud) 我很难获得一个非常简单的存储过程.请考虑以下文章表格片段:
id replaced_by baseID
1 2 0
2 3 0
3 0 0
Run Code Online (Sandbox Code Playgroud)
一个简单的分层表,使用copy-on-write.编辑文章时,当前文章的replacement_by字段将设置为其新副本的ID.
我添加了一个baseID字段,将来应该存储一篇文章的baseID.在上面的例子中,有一篇文章(例如id 3).它的baseID是1.
为了获取baseID,我创建了以下存储过程:
DELIMITER $$
CREATE FUNCTION getBaseID(articleID INT) RETURNS INT
BEGIN
DECLARE x INT;
DECLARE y INT;
SET x = articleID;
sloop:LOOP
SELECT id INTO y FROM article WHERE replaced_by_articleID = x;
IF y IS NOT NULL THEN
SET x = y;
ITERATE sloop;
ELSE
LEAVE sloop;
END IF;
END LOOP;
RETURN x;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
这看起来很简单,直到我实际调用函数使用:
SELECT getBaseID(3);
Run Code Online (Sandbox Code Playgroud)
我希望,函数返回1.我甚至愿意理解它可能需要一秒钟.相反,机器的CPU上升到100%(mysqld).
我甚REPEAT .. UNTIL …
我需要在plpgsql中生成一个随机数的非重复随机数.非重复数字应落在[1,1001]范围内.但是,代码生成的数字超过1001.
directed2number := trunc(Random()*7+1);
counter := directed2number
while counter > 0
loop
to_point := trunc((random() * 1/directed2number - counter/directed2number + 1) * 1001 +1);
...
...
counter := counter - 1;
end loop;
Run Code Online (Sandbox Code Playgroud) random postgresql stored-procedures plpgsql stored-functions
我有一个SQL查询具有以下结构:
SELECT *, storedfunc(param, table.field) as f
FROM table
WHERE storedfunc(param, table.field) < value
ORDER BY storedfunc(param, table.field);
Run Code Online (Sandbox Code Playgroud)
有没有办法优化这个消除几个函数调用?或者MySQL是否在幕后执行此类优化?事实上,该函数被声明为确定性的.
我还需要提一下,函数参数部分来自选定表的列.我稍微改变了这个例子以反映这一点.
我正在创建一个存储函数,它应该向表中插入新行.在这个表中也是一个独特的列.
如何检查一切是否正常并且插入了行?
如何确切地检查是否找到了这个唯一的列(例如 - 尝试添加重复值)?
无论我到哪里,看起来MySQL存储过程都可以进行交易.然而,当我声明我的存储函数时
create function test( a int )
returns int
MODIFIES SQL DATA
BEGIN
START TRANSACTION ;
update t set col='some value' where id=a ;
COMMIT ;
return 0 ;
END //
Run Code Online (Sandbox Code Playgroud)
我明白了
错误代码:1422.存储函数或触发器中不允许显式或隐式提交.
stored-functions ×10
mysql ×7
sql ×3
database ×1
loops ×1
optimization ×1
oracle ×1
plpgsql ×1
plsql ×1
postgresql ×1
random ×1
recursion ×1
throw ×1