Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新WHERE';1';=';1';_Sql_Oracle_Jdbc - Fatal编程技术网

Sql 更新WHERE';1';=';1';

Sql 更新WHERE';1';=';1';,sql,oracle,jdbc,Sql,Oracle,Jdbc,当为我的sql动态生成WHERE子句时,我喜欢将WHERE'1'='1'硬编码到sql中,这样我就不必跟踪是否将和前置到下面的每个子句中。这在很多地方都有很好的记录,比如这个 对于UPDATE语句,是否存在动态生成SET子句的等效模式?我宁愿不记录是否需要在前面加逗号。如果没有任何通用解决方案,这将用于通过jdbc与oracle数据库交互 编辑 对于我的特定用例,我需要动态地更改正在设置的列。因此,任何要求查询包含所设置的所有列的解决方案都是不可行的。我们有一个包含20多个列的表,但在任何给定时

当为我的sql动态生成
WHERE
子句时,我喜欢将
WHERE'1'='1'
硬编码到sql中,这样我就不必跟踪是否将
前置到下面的每个子句中。这在很多地方都有很好的记录,比如这个

对于
UPDATE
语句,是否存在动态生成
SET
子句的等效模式?我宁愿不记录是否需要在前面加逗号。如果没有任何通用解决方案,这将用于通过jdbc与oracle数据库交互

编辑
对于我的特定用例,我需要动态地更改正在设置的列。因此,任何要求查询包含所设置的所有列的解决方案都是不可行的。我们有一个包含20多个列的表,但在任何给定时间只有3或4个列会发生更改。我们运行了一些负载测试,发现满足性能目标的唯一方法就是只发送需要更新的数据。现在我正试图编写一些漂亮的代码来实现这一点。

一种避免为了添加逗号而跟踪列计数的方法是始终分配所有可能的列,并传递一组控制变量来决定是否应分配列:

UPDATE MyTable
SET
    col1 = CASE ? WHEN 1 THEN ? ELSE col1 END
,   col2 = CASE ? WHEN 1 THEN ? ELSE col2 END
,   col3 = CASE ? WHEN 1 THEN ? ELSE col3 END
WHERE
    ... -- condition goes here
奇数索引处的参数是您传递的标志,用于指示必须设置相应的列。对应偶数索引处的参数是要设置的值,如果未设置相应字段,则为
NULL


这种方法将需要传递的JDBC参数数量增加了一倍,但作为回报,您会得到一条语句,其中所有列的位置都是固定的,因此您可以准备并重用它,而不是动态构建它。

首先,如果没有任何更改,最好不要执行查询

但如果你不得不这样做,或者以其他方式做成本更高,你通常可以这样做:

UPDATE 
  MY_TABLE
SET
  <if test="xx">  COL1='VAL1',</if>
  ID=ID
where 1=1
  COL1 like 'VAL%';
更新
我的桌子
设置
COL1='VAL1',
ID=ID
其中1=1
COL1类似于“VAL%”;
ID=ID
作为noop


请记住,这仍然会执行更新并产生所有“副作用”,如运行触发器。

如果底层Oracle数据库有许多
update
触发器,这将使事情变得复杂,因为Oracle在确定是否应触发触发器时不区分
UPDATE mytable SET mycolumn=mycolumn
和'UPDATE mytable SET mycolumn=mynewvalue'。+1是一个很好的答案,但不幸不符合我的用例。我用更多的标准更新了原始问题,很抱歉不清楚。@Josh“[我们]发现满足性能目标的唯一方法就是只发送需要更新的数据”您仍然只发送需要更新的数据,其余列将为
NULL
s,因此它们只占用很少的带宽。能够准备语句,而不是每次使用不同的SQL,应该可以节省大量的时间。传入没有更改的列不会仍然导致数据库花费时间“写入”值,即使它是相同的值吗?例如,如果其中一列是一大块文本该怎么办?@Josh根据,Oracle针对更新不改变值的情况进行了一些优化。例如,当列被索引时,Oracle不会接触索引。不过,它会写撤销和重做日志,但文章中不清楚这是发生在更新行的所有列上,还是只发生在更新中提到的列上。找到答案的最好方法当然是分析。简短的答案是否定的。就我个人而言,我讨厌“1=1”的东西,我更喜欢编写更智能的逻辑,知道是预先编写
还是
,这取决于需要连接多少个表达式。您可能希望观察系统必须处理的解析负载-确保每次都以相同的顺序生成具有列的SET子句,以最大限度地减少这种情况。这是有效的:
DECLARE@dummy VARCHAR(1)='a';更新my_table SET@dummy=@dummy,其中1=1和my_second_column='my second Value'
。但是,这并不是:
声明@dummy VARCHAR(1)='a';更新我的\u表设置我的\u第一列='我的第一个值',@dummy=@dummy,其中1=1和我的\u第二列='我的第二个值'
单行更新将永远不会在Postgres中锁定整个表。无论何处条件或列是什么updated@a_horse_with_no_name谢谢你的评论。这发生在Oracle上,给我带来了一个严重的问题,因此我决定更新答案。Oracle在执行
更新时也不会锁定整个表。谢谢你的评论,我现在明白了,我可能过度扩展了我的结论。我遇到的情况略有不同。请看一看