mysql - 如何处理 MySQL 过程和函数

标签 mysql

我是一位经验丰富的 MS SQL 开发人员。从 mssql 到 mysql 对我来说有点令人沮丧。为了简短起见,我想问一下一些标准的mssql任务是如何在mysql中完成的。我注意到的第一件事是 mysql 函数不能返回结果集。在 mssql 中使用这样的函数是微不足道的。 在伪代码中:

CREATE FUNCTION fn_test()
RETURNS TABLE
AS
RETURN
SELECT * FROM SomeTable

然后:

SELECT * FROM table1 AS t1
INNER JOIN fn_test() AS fn ON t1.condition = fn.condition

这在 mysql 中是不可能的,经过一个小时的研究,我发现的方法是创建一个过程,在创建一个临时表中,在其中插入值,在执行该过程后,该表保持“事件”状态连接级别,然后删除表。这对我来说似乎是一个开销。所以这里的问题是:

1) 如果假设它们有 500 个连接,并且所有这些连接都执行假设使用我提到的方法的 2-3 个过程,这意味着 500x1 个临时表 x2 个过程调用 = 1000 个临时表。服务器将如何处理这种技术?

2) 这是唯一的方法吗,有没有比这个更好的方法,例如通过 View 或其他方法?

3) 对于这个特定场景,您选择哪种方法?

最佳答案

我建议不要期望某个供应商在其他供应商的产品中进行程序扩展。我敢打赌,也不存在 PL-SQL。事实上,我知道它不存在。我还要补充一点,MS 使它比 DB 世界中的其他一些更容易。

但是,MySQL 具有用户定义函数或 UDF 的概念。阅读更多 HERE授予临时表可能是一个不错的选择,但在您的情况下,您可能需要创建自己的函数。

这是对 MySQL 函数和运算符的另一个引用 HERE

编辑: 要回答您的问题,您必须使用存储过程在 MySQL 中返回一个表。

DELIMITER $$

 CREATE DEFINER=`root`@`%` PROCEDURE `ret_table`(OUT my_ErrMessage   VARCHAR(200))
 BEGIN
 DECLARE EXIT HANDLER FOR SQLEXCEPTION
 BEGIN
SET my_ErrMessage = 'Error in procedure ret_table';
 END;

 SELECT * FROM SomeTable;
END

我要补充一点,除非您的临时表非常大,否则 500 多个连接和 1000 多个临时表在数据库环境中并不罕见。此外,就内存而言,通过函数调用返回的表与临时表没有太大区别。您没有在上面提到任何功能要求,只是一个无法通过函数调用返回表的理论问题。

最后,我一点也不反对 MS,但是在 Windows 中使用他们的开发工具时,很容易模糊您通常在应用程序层中所做的工作与您在数据库中所做的工作之间的界限。 MySQL 不会成为 MS SQL Server 或 Oracle,但它会满足您的需求。您只需要以不同的方式解决问题。

我会这样做:

CREATE TEMPORARY TABLE IF NOT EXISTS someTab1 AS (SELECT * FROM SomeTable);

SELECT * FROM table1 AS t1
INNER JOIN someTab1 AS st1 ON t1.condition = st1.condition

我知道这不是 fn(),但在内存使用或性能方面,选择临时表与通过 fn() 返回表有何不同。如果您需要错误处理,请将其全部包装在存储过程中。

关于mysql - 如何处理 MySQL 过程和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24499162/

相关文章:

php - 我的更新 cade 有什么问题吗?

php - 如何对mysql进行多重求和?

mysql 依赖非空列

sql - MySQL - 选择 "Everyone who booked last January, but hasn' t 今年 1 月预订”

mysql - 无法消除mysql查询中的重复

mysql - Big Mysql 查询(连接结果中的计数并修改字符串)

mysql - 复制粘贴与输入 "alter user "root“@"localhost"标识为...”

PHP/MySQL/Jquery - 构建关联数组并使用 JQuery $.each 输出它

php - 选择两列中一列为空的行

java - hibernate mysql innodb