很多开发者一提到 SQL 就“谈此色变”,觉得难以调试、难以定位 bug
最后就是一句话,就是这个东西碰不得,是邪教。
存储过程这个东西存在这么久,不可能一无是处吧
有没有可能,像 TypeScript 转译为 JavaScript 一样,有一种高级语言可以:
编译成各类数据库支持的 SQL (比如 PostgreSQL 、SQL Server 等);
根据目标数据库的特性自动优化生成对应代码;
如果使用了目标数据库不支持的语法,比如在目标是 PostgreSQL 时用到了 SQL Server 的专有语法,那么编译器应能直接报错并给出明确提示;
最好还能在开发阶段提供类型检查、智能提示和跨平台兼容性检查。
![]() |
1
cxe2v 12 小时 43 分钟前
出来多少年的 ORM 框架不就是你要的东西
|
2
lpxxn 12 小时 43 分钟前 ![]() 100%洪水猛兽
|
3
zhanlanhuizhang 12 小时 39 分钟前
没有吧,公司里面所有的系统都用了。
|
4
Debug1998 12 小时 39 分钟前 ![]() 我维护过离职人员写的存储过程,这个东西的使用,我有两个问题:1. 执行出了问题,只能写表记录异常、错误信息? 2. 存储过程和 Java 等语言实现相同的功能,在代码上存储过程是否更不易理解。
|
![]() |
5
zjsxwc 12 小时 38 分钟前 ![]() 有
就是全球最大的 ERP 软件,德国思爱普 SAP 的 abap 语言。 abap 就是进阶版本的 SQL 语言,这个 sql 语言不但能操作数据库,还能用来描述用户交互界面。 |
6
MuSeCanYang 12 小时 36 分钟前
存储过程的逻辑,在我们这占了最起码 30%
稍微复杂一点的数据交互,不用存储过程,慢的要死。 |
7
spritecn 12 小时 34 分钟前
甚至 xml 都是洪水猛兽,超过 5 行根本看不懂,存储的语法和 bat,shell 有得一比,一般人看不懂,不像 java,python 那么直接
|
![]() |
8
felixcode 12 小时 33 分钟前 via Android ![]() 有学习门槛的东西,都有可能被找借口躲避
|
![]() |
9
xiangbohua 12 小时 32 分钟前
不会用不好管理而已,实际上用的好的话,性能很不错
|
![]() |
10
cheng6563 12 小时 31 分钟前
当项目管理起来还行,不管理直接上数据库随便改那就是洪水猛兽。
|
![]() |
11
sanmaozhao 12 小时 28 分钟前
存储过程还有一个问题:可移植性差
如果需要支持不同的数据库,一般就没法用存储过程了 |
![]() |
12
msg7086 12 小时 21 分钟前
不同的东西有不同的使用场景啊。
说是邪教的,无非是因为他们的使用场景不适合用存储过程罢了。 给你一台 1TB 内存 128 核心的服务器跑 Oracle 数据库,用户数量就 1 万人,业务逻辑常年不多变,你告诉我为啥不用存储过程。 |
![]() |
13
iugo 12 小时 17 分钟前
如果存储过程和后端的业务逻辑是两班人马写, 并且 存储过程 可以静态分析, 那么 存储过程 才可以接受.
性能问题, 更应该用别的方式优化, 比如调整结构, 异步, 分布式, 缓存等. |
![]() |
14
SupperHobby 12 小时 16 分钟前
银行都是存储过程
|
15
forbreak 12 小时 15 分钟前
个人觉得存储过程的问题,主要还是团队人数太多的时候,管理不善带来的。 新旧人员交接,互相关联的业务多个存储过程和代码里面的业务交叉影响等。 存储过程本身倒是没什么大问题。
|
![]() |
16
sagaxu 12 小时 14 分钟前
哪个高级语言没有操作 DB 的 DSL ?完全满足你这几个要求。
谈 SQL 色变,那是因为不熟悉,系统性学过 SQL 的开发者很少,给存储过程加过断点的更少。 |
![]() |
17
eraserrain 12 小时 13 分钟前
你好是的,debug 和版本管理简直灾难,虽然有时候设一些 sp 和 trigger 还蛮好用的
|
![]() |
18
lujiaxing 12 小时 11 分钟前
看情况. 对于互联网企业来说, 存储过程本身就是没必要的. 互联网企业本身业务非常简单, 几乎无外乎 CURD.
但是对于 SAP, 用友, 久其, 任我行那些 ERP 系统, 以及四通一达的那些 WMS 系统来说, 存储过程就是解决复杂需求的利器. 哦对, 也包括电信运营商与银行. 它们的存储过程更加复杂, 但存储过程对他们来说也往往是必然的选择. 业务逻辑越是复杂, 存储过程的就越是有存在的必要. 哦对, 铁路的 TRS 后面的业务逻辑全都是存储过程. |
![]() |
19
totoro52 12 小时 11 分钟前 ![]() 等你维护到几百个储存过程的古老项目就知道了,每天写代码都感觉自己在学习黑魔法
|
![]() |
20
xdzhang 12 小时 5 分钟前
我这里还有一套系统全是视图存储过程触发器,其中有些看都不想看。
|
21
roundgis 12 小时 4 分钟前 via Android
當然不是
大把內部系統就是兩層架構 客戶端直連數據庫 邏輯就是存儲過程 |
![]() |
22
Mrun 12 小时 4 分钟前 ![]() 因为国内大部分公司的业务就是 MySQL 撑起来的,绝大多数程序员写了十几年的代码,都极少接触 MySQL 之外的数据库。
稍微复杂的公司业务,比如银行电信,特别是 ERP 之类的,核心业务系统谁没事用 MySQL 这种弱鸡数据库 |
24
fffq 11 小时 52 分钟前
不是,学习成本罢了
|
25
yvyvyv 11 小时 52 分钟前
感觉是时代变化了,我进的第一家公司就有大量的存储过程,函数,触发器。那些基本上都是 08-12 年间留下来的代码。后来的观念就是重视程序,尽量不依赖数据库处理逻辑。现在所在的公司已经完全没有数据库层面的逻辑了
|
![]() |
26
skydcnmana 11 小时 49 分钟前
我不用它完全是觉得这玩意就是石器时代工具,连关系数据库都是过于原始了。
|
![]() |
27
pkoukk 11 小时 47 分钟前
你司有一大群 DBA 么?没有就别用
上面说某些行业有用的,你看看他们有多少 DBA ,或者每年花多少钱从 Oracle 买 DBA 服务 |
![]() |
28
wetalk 11 小时 45 分钟前
一个是难维护,另外难以横向扩展,说人话就是不容易通过加机器解决性能瓶颈
|
![]() |
29
carytseng 11 小时 42 分钟前 ![]() 主要是维护困难,假如你是接手的程序,出了数据问题让你排查,给你一段过千行的 sql ,重新阅读理解排查,那滋味儿酸爽
|
![]() |
30
zbatman 11 小时 41 分钟前
我认为存储过程不是优势,而是无奈
|
![]() |
31
bk201 11 小时 41 分钟前
并不那么绝对吧,一切技术的应用都看场景,但是一般情况下,都没有必要使用存储过程。
|
![]() |
32
dlmy 11 小时 38 分钟前 ![]() 存储过程就是洪水猛兽。
大学刚毕业进了某头部保险公司,做的项目是收付系统,核心业务是 “核算 核销 对账”,这些核心功能全部由 Oracle 存储过程实现,SQL 总行数在 5w 行左右,涉及到 90 多张表,其中最大的一张表 495 个字段。 当领导安排我来核算几亿条保单数据的收付情况时,面对上万行的存储过程,我人直接傻了,恨不得马上离职,这也成为了我职场上一辈子的心理阴影...... |
33
werls 11 小时 27 分钟前
写的时候是非常的开心,但是不要叫我维护,或者解决 bug 。那可不行
|
![]() |
35
cenbiq 11 小时 23 分钟前
存储过程 极度违反 存储与业务分离
|
36
pipixiarwksb 11 小时 20 分钟前
@sanmaozhao #11 这句话是真的 迁移的过程能多混几个工作日可能都不止
|
![]() |
37
Felldeadbird 11 小时 17 分钟前
存储过程也不是洪水猛兽,没有 DBA 的公司,开发者写存储过程后,他离职了没人记得这玩意。后面接手的人可能永远不知道这玩意存在。
|
38
tanhui2333 11 小时 11 分钟前
不要开历史倒车
|
39
sumu 11 小时 10 分钟前
项目中整了几个,多年维护下来:极其的好用,极其的反人类
|
40
back0893 11 小时 0 分钟前
不知道 这有文档么?
没有文档前提下能有代码容易看懂么? |
![]() |
41
lujiaxing 10 小时 58 分钟前
@tanhui2333 这个不是开历史倒车. 是有些场景下只有存储过程合适. 在大并发高一致性高实时性的场景. 比如银行. 你不可能说这边支付完了过了好几秒余额才减掉吧.
|
42
Rickkkkkkk 10 小时 57 分钟前
你都招不到会用这个东西的人。
|
![]() |
43
idragonet 10 小时 55 分钟前
我们 MES 都是存储过程,6-7K 个。 无所谓了,职场都有工具人。
|
44
frankies 10 小时 54 分钟前
看行业的,比如银行、ERP 系统、财务管理系统这些,存储过程是大量使用的。而互联网行业,我认为如无必要坚决不使用存储过程。
|
45
xiaomushen 10 小时 54 分钟前
你自己写的时候,绝对不会认为是洪水猛兽。
等接手的人维护修改时候,绝对会喷这是洪水猛兽 所以,是不是洪水猛兽,要看站在谁的角度 |
46
leonhao 10 小时 51 分钟前
数据量大,业务逻辑复杂,存储过程非常好用
|
47
yangzzzzzz 10 小时 49 分钟前
之前公司的架构师设计的前端直接掉存储过程,设想非常好,实际应用中 一个简单的见面掉几十上百个过程 ,前端人都麻了
|
![]() |
48
ericguo 10 小时 48 分钟前 ![]() 到 2025 年为止,我还找不到一个编程语言,除了存储过程,能够在 0.5 秒内改变系统的逻辑,不用发布,不用测试,走任何流程,不留下任何记录,而且门槛极低。
如果你认为上面我说的全是优点,那显然应该用。 |
49
xiaomushen 10 小时 45 分钟前
@ericguo 数据库可以开 Audit ,不可能不留任何记录
|
50
xiaomushen 10 小时 44 分钟前
@yangzzzzzz 类似的行为艺术架构师,还是有想法的:核心人员无法被裁
|
![]() |
51
imnpc 10 小时 37 分钟前
没有专职 DBA ,不要用存储过程
|
![]() |
53
shangfabao 10 小时 29 分钟前
你要是存储过程文档很详细,用就用了,前提有 DBA
|
54
QlanQ 10 小时 28 分钟前
以前 维护 ERP 的时候,就是前端用的那种 我都忘记叫什么了,就是前端直接调用数据库的存储过程
整个系统主要是依赖存储过程 维护、升级特别复杂,数据库绑定,绑定到版本,数据库如果语法有修改,存储过程都要重来 现在 接口系统,都是 分布式、数据业务分离,存储过程就不合适了 |
![]() |
55
catamaran 10 小时 27 分钟前
存储过程的一个问题是 sql 没有普通的高级语言语法丰富,导致阅读书写代码要困难一些,然后 debug 比较困难,我知道 sql server 的 sp 是可以 debug 的,不知道 oracle 行不行,mysql 是不行的。
|
56
ymy3232 9 小时 55 分钟前
成本低,不用招专门的大数据开发,我们之前一天百亿条数据,用 8 个 mysql 来跑存储过程,成本比用数据湖低的多
|
57
Nanmi 9 小时 54 分钟前
曾经刚毕业的时候,在一家做银行软件的公司,那个时候用的也是存储过程,阅读起来极其费劲,维护特别困难,当然对于高手来说,也不是啥事儿,但是如果是对于初入职场的人来说,去维护一些边角料的功能你都会觉得很恶心🤢。
记得后面离职 1 年多的时候时候,这套核心系统终于被彻底重构了,存储过程的那部分逻辑全部用 java 重写了。 |
58
bbao 9 小时 52 分钟前
上一次看到这个词应该还是在 2009 年刚工作的时候~~~~
|
![]() |
60
lambdaq 9 小时 48 分钟前 ![]() 存储过程 不就是个 low code
|
61
aureole999 9 小时 24 分钟前
@lujiaxing 也不能这么说,像我以前做证券,一样有支付什么的啊,也不用存储过程。像支付宝什么的,也不见得非要用存储过程吧。
以前存储过程确实在这方面比较好用,所以用得多,后面人们慢慢发现了缺点就用得少了。但有些项目有历史包袱还是得接着用。如今微服务什么的,用得很多,现在缺点也逐渐暴露出来,以后怎么样还不知道。每个技术都有时代的局限性。 |
62
wxf666 9 小时 1 分钟前
@sanmaozhao #11
@pipixiarwksb #36 有 AI 的年代,改写成不同语言,应该都不是啥问题吧。。 @dlmy #32 5W SQL 转成编程语言实现,复杂性会降低多少呢?感觉 SQL 实现一般都更简短呀。。 |
63
layxy 8 小时 38 分钟前
搞不明白,明明代码可以处理,非要写存储过程,搞得代码逻辑处理一半,存储过程处理一半,徒增心智负担
|
64
jeffreyWang007 8 小时 33 分钟前
也很好奇,存储过程应该如何做版本管理?
|
![]() |
65
lujiaxing 8 小时 33 分钟前
@aureole999 银行的账务逻辑比证券复杂多了.
|
![]() |
66
lesismal 8 小时 27 分钟前
很多传统企业级、FinTech 用 IOE 之类的那套,量级不那么大,安全性第一,可以、但不是必须。
其他 ToC 尤其是国内这些: 1. 海量用户海量并发的,存储过程单点性能就不太合适了 2. 业务需求的快速迭代,存储过程开发和维护都是不合适的 国内很多企业去 IOE 的过程中,存储过程也越来越少、很多团队已经消灭存储过程了。 老屎山,能不动,就不动; 新项目,能不用,就不用。 |
67
ZGame 8 小时 17 分钟前
并不是,很难说现在的 flinksql 大数据那一套不算另一种方式的存储过程。 最主要是如何包装和平台化,让其他非开发人员也参与进来。 并且能够妥善的维护 而不是丢到数据库里就不管了。 所以还是屁股决定脑袋,你是 dba 还是开发 可能有不同的感受
|
![]() |
68
dabao 8 小时 13 分钟前
你是不是在找“ORM”
|
69
ytll21 8 小时 12 分钟前
@lujiaxing #65 银行的账务逻辑比证券复杂多了.
--------------------- 无法认同。都是语言,不存在只有存储过程才能对应的业务逻辑。 存储过程当初出现的原因,是因为大型机,以及前后端分离的技术不成熟。但是随着云计算的出现,算力已经不成为问题,那么存储过程的语言问题就变成了阻碍,无法方便的重构,调试和缺少语法糖,都是影响开发效率的存在。 现在还在用存储过程的企业,只能认为是有历史包袱在,迫不得已的选择。 |
![]() |
70
ytmsdy 8 小时 12 分钟前
如果当年没有去 IOE 的运动,估计现在还有一大波的人在写存储过程。
存储过程写起来是爽,多表关联,批量更新,效率也非常高。大约 2014 年,2015 年之前的 ERP 系统,后面的业务逻辑基本上都是存储过程,银行系统,电力系统,大型企业的内部管理系统,基本上都是存储过程。 但是维护这玩意儿也是噩梦,没日志,debug 麻烦。有时候业务提交上来一个 bug ,你定位到了 bug 是在具体哪个存储过程导致的,然后要修这个 bug 的时候,有时候是很绝望的! 之前关于存储过程不是有这么一个冷笑话么,系统出现 bug 了,一个程序猿搞了两个礼拜,然后经理说,我现在有一个好消息和一个坏消息。好消息是我定位到了 bug 是在那个存储过程里面产生的,坏消息是这个存储过程有 3000 行。 |
![]() |
72
ytmsdy 8 小时 7 分钟前
@jeffreyWang007
做得好的公司会和普通代码一样,导出成 SQL ,然后上传 SVN 或者 git 。 做的不好的公司就直接运行发布了,最多在存储过程里面写一下注释,把之前的逻辑注释掉,然后写新的逻辑 |
![]() |
73
realpg 8 小时 7 分钟前
本地那种商业软件放心用 0.1QPS 都没有的 无所谓性能
你给 1KQPS+的互联网服务大众的系统数据操作都扔存储过程里 大概率卡到地球另一边 |
74
seansong 8 小时 4 分钟前
存储过程比直接写在应用代码里面,更难以调试,版本控制也难,同时 pgSQL 之类的数据库语言的表达能力也显著弱于应用层语言,倒不是说存储过程不能用,只是必要性越来越低,出于熟悉程度、调试之类的考虑,就慢慢被越来越淘汰了
|
75
yingqi1 7 小时 17 分钟前
只要弄好 单元测试 / 版本管理,什么语言都无所谓。
|
![]() |
76
nuk 7 小时 10 分钟前
如果是复杂的存储过程我们一般都是自动转译的,sql 基本没办法调试,没必要在上面浪费人力。
|
![]() |
77
xshell 7 小时 7 分钟前
新功能都不让使用存储过程,老代码里面有存储过程让能正常运行就行·
|
![]() |
78
lujiaxing 7 小时 3 分钟前
@ytll21 不用存储过程, 用程序处理的话, 终归会有反复与数据库交互的过程. 十次八次的还好, 像某些银行那样的系统, 一笔交易涉及各种跨库跨表查询几十个 (尤其有不少还涉及到本地服务, 如水电气缴费, 地方分行/支行企业合作业务, 自动扣费业务/罚款等), 反复与数据库交互的这个通讯的成本是很高的. 一般来说银行的各种交易必须在几百毫秒之内结束, 而且不可以出现单据不一致的情况. 这与互联网企业的最终一致性要求是不一样的. 银行, 电信系统之类的, 要求的都是实时强一致性. 在这种需求之下, 存储过程是最好的. 至于研发难度, 反正也不是老板需要面对的事情. 有难度你们研发慢慢啃去呗.
|
![]() |
80
CoderGeek 6 小时 59 分钟前
我现在碰到的 一个业务 代码 30%基本校验 参数传递 然后调存储过程 70%逻辑在哪里 不恶心吗 真的很恶心
|
81
ala2008 6 小时 57 分钟前
那存储过程要代码评审吗
|
82
liuidetmks OP @zbatman 😂,看来手势返回的那个帖子冒犯到你了
|
![]() |
83
raptor 6 小时 20 分钟前
存储过程是历史遗迹,曾经很有用,但现在只剩缺点了……
|
84
tohuer00 6 小时 7 分钟前
优点非常诱人,直接消除了网络 io ;缺点也足够致命,复杂场景那就是没法维护,不知道以后是否可以用 ai 来协助。要用好还真不是三言两语能说清楚的。
有些人扯 orm 是什么情况?这特么是同一个应用场景的东西? |
![]() |
85
min 5 小时 44 分钟前
主要看是多少行的存储过程
现在有 ai 了,维护起来应该会比以前简单一些 |
![]() |
86
wupher 5 小时 44 分钟前
旧时代的 CS 平台经常是这么玩的。
主要逻辑以存储过程存在于 DB 中。Client 主要用于界面展示,数据计算及各种逻辑大都使用存储过程。 优点缺点都是有的,有维护开发的人可以说道很多,现在使用这种架构的仍然不少。 到 BS 时代后,一般改用代码,也是 ORM 框架了。 你写写就知道了,一堆 CS 相关产品的公司仍然在用,去试试就好。 |
87
drafter 5 小时 43 分钟前
可能受 DDD 影响,觉得存储过程这种东西太依赖对应的数据库了,而数据库一般都是可替换的,涉及到核心业务就非常危险了,像你说的,如果未来与一种高级语言支持各类数据库的存储过程,用这个高级语言去编写核心业务,这个是可以接受的。
|
88
wysnxzm 5 小时 40 分钟前 ![]() 只要不用我维护那它就最棒
|
![]() |
89
CoderGeek 5 小时 38 分钟前
一旦换个 db 存储模式 直接爆炸 代码都不知道咋写 😄
|
90
mappple 5 小时 30 分钟前
银行国产化了之后也不太用了
|
![]() |
91
liyafe1997 5 小时 13 分钟前
脱离具体业务谈这个就是耍流氓
|
![]() |
92
cubecube 4 小时 43 分钟前
如果是单体应用,未来扩展性也基本上一个 db 能抗住,那么存储过程其实是利器。写写注释即可。
|
![]() |
94
nthin0 4 小时 22 分钟前
接手其他人写的存储过程做维护和加功能简直酸爽,天天骂娘
|
95
JaysonHope 4 小时 20 分钟前
@idragonet 我接触的 mes 系统,用存储过程的还是少,有的公司真的如楼主所言,谈此色变,命令禁止。我曾经为了不写存储过程,写查询语句写了 200 多行,关联 10 多张表。
|
96
salmon5 4 小时 16 分钟前
这个取决于出了问题谁负责,如果谁写的谁负责,那就 OK
|
97
xiaomushen 4 小时 11 分钟前
@salmon5 软件行业,又不像建筑行业那样,出了问题终身刑责。写存储过程的人离职了,你怎么办?
|
98
xiaomushen 4 小时 9 分钟前
@tohuer00 如果学建筑业那样,终身追责,事故入刑,那难维护的问题,应该会好一些。哈哈哈
|
99
salmon5 4 小时 3 分钟前
@xiaomushen #97 那存储过程是个偷懒的方案,应该禁止使用
|