【问题标题】:MariaDB stored functionsMariaDB 存储函数
【发布时间】:2020-12-29 06:35:19
【问题描述】:

目前,我的所有 sql 查询都写在我的 PHP 文件中,在每个类方法中。是否可以将所有这些查询移动到数据库中的存储过程或存储函数中并简单地将相应的值/参数从 PHP 传递给它们?

我已经阅读了一些文档,但仍然不清楚。

谢谢。 :)

【问题讨论】:

  • 当然。您可以创建存储过程并调用它,而不是执行放置在 SP 主体中的查询。您可以创建用户定义的函数并使用它来代替放置在 UDF 主体中的表达式。

标签: mysql sql stored-procedures mariadb stored-functions


【解决方案1】:

大多数查询都可以移动到存储过程中,但可能不是全部。请参阅 mariadb 在which SQL statements cannot be used in stored procedures 上的文档:

  • 改变视图;您可以改用 CREATE OR REPLACE VIEW。加载数据和
  • 加载表。 INSERT DELAYED 是允许的,但语句会被处理
  • 作为常规 INSERT。
  • 锁定表和解锁表。
  • 在存储例程内的准备好的语句中对局部变量的引用(改用用户定义的变量)。
  • BEGIN (WORK) 被视为 BEGIN END 块的开始,而不是事务,因此需要改为使用 START TRANSACTION。
  • 允许的数量 递归调用仅限于 max_sp_recursion_depth。如果这个变量 为 0(默认),递归被禁用。该限制不适用于 存储函数。
  • prepared 中不允许的大多数语句 存储程序中不允许使用语句。见准备 语句:允许的语句列表的语句可以是 用过。
  • SIGNAL、RESIGNAL 和 GET DIAGNOSTICS 是例外,可能是 在存储例程中使用

话虽如此,尽管 SQL 语句可以移动到存储过程中,但由于代码复杂性或性能原因,您可能不一定要这样做。

【讨论】:

  • 感谢您的回复。没有那么复杂。我正在对数据进行简单的 CRUD 操作。更复杂的任务直接使用 sql 查询手动或在 PHPMyAdmin 中完成。
  • 什么程度的复杂性会否定它的使用?如果查询从 PHP 传递到数据库时运行得很快,那么作为基准测试就足够了吗?或者存储过程/函数是否以不同的速度运行?因此需要他们自己的测试?
  • 很抱歉,您的问题没有通用答案。您需要评估/测试要移动到存储过程中的每个案例。
【解决方案2】:
DELIMITER $$
create procedure `accounting`.`delete_invoice_line` (invoice_line_id INT)
BEGIN
delete from invoice_line where id = invoice_line_id;
END;
$$
DELIMITER ;

我必须弄清楚创建程序的格式。我正在遵循这种模式,它似乎工作正常。然后授予用户名的执行权限。

感谢大家的意见。 :)

【讨论】:

    猜你喜欢
    • 2019-01-28
    • 2020-10-11
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2014-04-09
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多