Instr带来的BUG
昨天下午技术部JAVA开发人员报告说 线上数据库无法删除数据,要我查看下数据库是否有什么锁住. 我还以为是死锁或者是什么阻塞之类了. 折腾下没有发现! 叫它把语句发来,他就把表名,而且是截图发过来的! 根据表名去找 删除的语句 SELECT SQL_ID,PIECE,SQL_TEXTF
昨天下午技术部JAVA开发人员报告说 线上数据库无法删除数据,要我查看下数据库是否有什么锁住. 我还以为是死锁或者是什么阻塞之类了.
折腾下没有发现!
叫它把语句发来,他就把表名,而且是截图发过来的!
根据表名去找 删除的语句
SELECT SQL_ID,PIECE,SQL_TEXT FROM V$SQLTEXT_WITH_NEWLINES WHERE SQL_ID IN( SELECT SQL_ID FROM V$SQLTEXT_WITH_NEWLINES WHERE SQL_TEXT LIKE '%table_name%') ORDER BY SQL_ID,PIECE;
select * from v$sql_bind_capture where sql_id in ('fpkt91ujqu853');
gquw3xgbqvu13: delete from paynum p WHERE INSTR(:1,','||PL_ID||',')>0 2014-3-12 17:44:13 ,3251,3250,3248,3247, 2014-3-11 11:56:18 ,3249, b5yjgrqx6j2dm: delete from paynum paynum WHERE INSTR(:1,''||PL_ID||'')>0 2014-3-13 17:45:02 ,3319, fpkt91ujqu853: delete from paynum_ELEMENT e WHERE INSTR(:1,','||e.ple_pl_id||',')>0 2014-3-13 17:45:02 ,3319, 其中 pay_element 是关联表 该表有paynum的外键 就是这个外键约束报的错误.
从上面看 删除paynum有两条不同的SQL语句 第一个估计是旧的,第二个是最近上线的.
根据变量的值 可以了解 先删除 关联表 输入变量 ',3319,' 然后删除PAYNUM表 同样输入变量',3319,'
我们同样可以看出来参数:1 不仅可以输入单个变量值,还可以输入一串变量的值 比如 ',3251,3250,3248,3247,'
从数据表查询3319值的记录 关联表 paynum_ELEMENT 已经被删除,而 PAYNUM 还存在 !
我们综合下
delete from paynum paynum WHERE INSTR(',3319,',''||PL_ID||'') > 0
对于这样的语句 做为地球普通人的我实在难以理解和猜透. 通过自身努力终于理解了它,来之汪星的写法!
select pl_id, INSTR(',3319,',''||PL_ID||'') from paynum;
我测试下 它确实能删除记录. 不过线上的行为就表现如下
PL_ID INSTR('3319',''||PL_ID||'') 1 3 31 2 33 1 331 1 3319 1 2279 0 2282 0 2281 0 2280 0
(源字符串, 目标字符串, 起始位置, 匹配序号)
在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置。只检索一次,就是说从字符的开始
发现了什么没?对没错误 狗屎的家伙 居然写反了 INSTR(',3319,',''||PL_ID||'')
正常写法是INSTR(''||PL_ID||'', ',3319,')
正常设计是:
delete from paynum paynum where paynum.pl_id=to_number(:?)

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Guide to Perfect Number in Java. Here we discuss the Definition, How to check Perfect number in Java?, examples with code implementation.

Guide to Weka in Java. Here we discuss the Introduction, how to use weka java, the type of platform, and advantages with examples.

Guide to Smith Number in Java. Here we discuss the Definition, How to check smith number in Java? example with code implementation.

In this article, we have kept the most asked Java Spring Interview Questions with their detailed answers. So that you can crack the interview.

Java 8 introduces the Stream API, providing a powerful and expressive way to process data collections. However, a common question when using Stream is: How to break or return from a forEach operation? Traditional loops allow for early interruption or return, but Stream's forEach method does not directly support this method. This article will explain the reasons and explore alternative methods for implementing premature termination in Stream processing systems. Further reading: Java Stream API improvements Understand Stream forEach The forEach method is a terminal operation that performs one operation on each element in the Stream. Its design intention is

Guide to TimeStamp to Date in Java. Here we also discuss the introduction and how to convert timestamp to date in java along with examples.

Capsules are three-dimensional geometric figures, composed of a cylinder and a hemisphere at both ends. The volume of the capsule can be calculated by adding the volume of the cylinder and the volume of the hemisphere at both ends. This tutorial will discuss how to calculate the volume of a given capsule in Java using different methods. Capsule volume formula The formula for capsule volume is as follows: Capsule volume = Cylindrical volume Volume Two hemisphere volume in, r: The radius of the hemisphere. h: The height of the cylinder (excluding the hemisphere). Example 1 enter Radius = 5 units Height = 10 units Output Volume = 1570.8 cubic units explain Calculate volume using formula: Volume = π × r2 × h (4

Java is a popular programming language that can be learned by both beginners and experienced developers. This tutorial starts with basic concepts and progresses through advanced topics. After installing the Java Development Kit, you can practice programming by creating a simple "Hello, World!" program. After you understand the code, use the command prompt to compile and run the program, and "Hello, World!" will be output on the console. Learning Java starts your programming journey, and as your mastery deepens, you can create more complex applications.
