【发布时间】:2010-07-26 13:23:53
【问题描述】:
在使用 SQLite 时,是否可以通过某种方式创建存储过程?
【问题讨论】:
在使用 SQLite 时,是否可以通过某种方式创建存储过程?
【问题讨论】:
SQLite 不得不牺牲一些人认为有用的其他特性,例如高并发、细粒度访问控制、丰富的内置函数集、存储过程、深奥的 SQL 语言特性、XML 和/或 Java 扩展、TB 或 PB 可扩展性等等
【讨论】:
答案:否
这就是为什么 ...我认为将过程存储在数据库中的一个关键原因是您在与 SQL 引擎相同的进程中执行 SP 代码。这对于设计为作为网络连接服务工作的数据库引擎是有意义的,但 SQLite 的必要性要小得多,因为它在应用程序进程中作为 DLL 运行,而不是在单独的 SQL 引擎进程中运行。因此,实现所有业务逻辑(包括宿主语言中的 SP 代码)更有意义。
但是,您可以在宿主语言(PHP、Python、Perl、C#、Javascript、Ruby 等)中使用自己的 user defined functions 扩展 SQLite。然后,您可以将这些自定义函数用作任何 SQLite 选择/更新/插入/删除的一部分。我已经 done this in C# 使用 DevArt's SQLite 来实现密码哈希。
【讨论】:
如果您仍然感兴趣,Chris Wolf 使用存储过程制作了 SQLite 的原型实现。您可以在他的博文中找到详细信息:Adding Stored Procedures to SQLite
【讨论】:
然而,可以使用以您的 fake-sp 命名的专用表和 AFTER INSERT 触发器来伪造它。专用表行包含您的假 sp 的参数,如果它需要返回结果,您可以拥有第二个(可能临时)表(名称与 fake-sp 相关)来包含这些结果。这将需要两个查询:第一个将数据插入到 fake-sp-trigger-table 中,第二个从 fake-sp-results-table 中选择,它可能是空的,或者如果出现问题有一个消息字段.
【讨论】:
不,但你可以:
Vars 保存变量CTE 之上创建View 以在纯SQL 查询中编写任意函数。因此,您可以执行通常使用存储过程执行的大多数操作。
有关如何在 SQL View 中编写函数,请参阅 https://www.cafe-encounter.net/p3300/pretending-that-sqlite-has-stored-procedures-and-functions。
您也可以:
这比您想象的更容易,工作量也更少!
分步指南位于https://www.cafe-encounter.net/p3244/installing-and-using-sqlite-extensions-on-macos-and-maybe-windows-linux-too。这确实增加了一些部署工作:您必须使用您的应用程序部署额外的 dll/so/dylib 文件。
【讨论】: