标签: stored-functions

如何在MySql过程中抛出错误?

什么是强制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

谢谢阿曼.

mysql stored-procedures stored-functions throw

11
推荐指数
2
解决办法
3万
查看次数

在sql server中测试Scalar与表值函数的性能

好的,所以我阅读了一大堆文章,建议表值函数和交叉应用提供比标量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)

sql sql-server-2005 stored-functions

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

即使在创建后,存储过程也不存在

我正在尝试创建一个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是我创建过程的数据库

我做错了什么?

任何人都可以帮助我吗?

mysql database stored-procedures stored-functions

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

是否存在类似于DETERMINISTIC的PL/SQL编译指示,但是对于单个SQL SELECT的范围?

在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值只调用一次函数(没有重大的性能影响)?

oracle optimization plsql deterministic stored-functions

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

MySQL中的递归存储函数

我正在尝试创建一个递归构建特定类别路径的函数

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)

mysql sql recursion recursive-query stored-functions

8
推荐指数
2
解决办法
2万
查看次数

如何在MySQL上正确循环存储函数?

我很难获得一个非常简单的存储过程.请考虑以下文章表格片段:

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 …

mysql loops stored-functions

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

通过循环在[0,1001]中生成随机数的非重复随机数

我需要在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

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

在SELECT和WHERE子句中优化存储的函数调用

我有一个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 stored-functions

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

如何检查INSERT在存储函数中是否运行良好?

我正在创建一个存储函数,它应该向表中插入新行.在这个表中也是一个独特的列.

如何检查一切是否正常并且插入了行?

如何确切地检查是否找到了这个唯一的列(例如 - 尝试添加重复值)?

mysql sql stored-functions

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

错误代码:1422.存储函数或触发器中不允许显式或隐式提交

无论我到哪里,看起来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.存储函数或触发器中不允许显式或隐式提交.

mysql stored-procedures stored-functions

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