问题描述
我目前在所有类方法中的PHP文件中都编写了所有SQL查询。是否可以将所有这些查询移到数据库中的存储过程或存储函数中,并从PHP中简单地将相应的值/参数传递给它们?
我已经阅读了一些文档,但仍然不清楚。
谢谢。 :)
解决方法
大多数查询都可以移到存储过程中,但可能不是全部。请参阅which SQL statements cannot be used in stored procedures上mariadb的文档:
- 更改视图;您可以改用CREATE或REPLACE VIEW。加载数据和
- 加载表。允许INSERT DELAYED,但是语句已处理
- 作为常规INSERT。
- 锁定表和解锁表。
- 对存储例程内已准备好的语句中的局部变量的引用(改为使用用户定义的变量)。
- BEGIN(WORK)被视为BEGIN END块的开始,而不是事务,因此需要使用START TRANSACTION。
- 允许的数量 递归调用限于max_sp_recursion_depth。如果这个变数 为0(默认),禁用递归。该限制不适用于 存储的功能。
- 已准备好的大多数语句 语句在存储程序中是不允许的。请参阅准备 语句:允许的语句列表,可以是 使用。
- SIGNAL,RESIGNAL和GET DIAGNOSTICS是例外,可能是 用于存储例程
话虽如此,即使可以将SQL语句移入存储过程,但由于代码复杂性或性能原因,您可能不一定要这样做。
,DELIMITER $$
create procedure `accounting`.`delete_invoice_line` (invoice_line_id INT)
BEGIN
delete from invoice_line where id = invoice_line_id;
END;
$$
DELIMITER ;
我必须弄清楚创建过程的格式。我正在遵循此模式,它似乎工作正常。然后授予用户名的执行权限。
谢谢大家的投入。 :)