当前位置:首页 » 编程语言 » sql未使用绑定变量修复建议
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql未使用绑定变量修复建议

发布时间: 2022-08-03 14:28:56

A. java程序操作sql报错 错误为: 并非所有变量都已绑定

您好,建议把sql语句在数据库中执行下,看能否正确执行。
我想大概是表里面所有的字段,你没有给全部赋值。
因为你insert into t_login 后面没有具体字段,那么就是全表的所有字段。
values后面给了三个字段。

B. 什么是SQL绑定变量,如何实现绑定变量

1. 认识绑定变量:

绑定变量是为了减少解析的,比如你有个语句这样
select aaa,bbb from ccc where ddd=eee;
如果经常通过改变eee这个谓词赋值来查询,像如下
select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;
每条语句都要被数据库解析一次,这样比较浪费资源,如果把eee换成“:1”这样的绑定变量形式,无论ddd后面是什么值,都不需要重复解析

Java实现绑定变量的方法:
[java] view plain
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 15.00);
pstmt.setInt(2, 110592);
/result statmement: UPDATE employees SET salay = 15.00 WHERE id = 110592
pstmt.executeQuery();

假设要将id从1到10000的员工的工资都更新为150.00元,不使用绑定变量,则:
[java] view plain
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4");
....
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000");
使用绑定变量,则:
[java] view plain
PreparedStatement pstmt;
for (id = 1; id < 10000; id )
{
if (null == pstmt)
pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 150.00);
pstmt.setInt(2, id);
pstmt.executeQuery();
}
二者区别在于,不用绑定变量,则相当于反复解析、执行了1w个sql语句。使用绑定变量,解析sql语句只用了一次,之后的9999次复用第一次生成的执行计划。显然,后者效率会更高一些。
2. 什么时候不应该/不必要使用绑定变量
a. 如果你用数据仓库,一条大查询一跑几个小时,根本没必要做绑定变量,因为解析的消耗微乎其微。
b. 变量对优化器产生执行计划有很重要的影响的时候:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数据非均匀分布)的列上会提供错误的执行计划。从而使得非高效的执行计划被使用。

3. 绑定变量在OceanBase中的实现
目前OceanBase中实现了绑定变量,目的主要是为了编程方便,而不是为了降低生成执行计划的代价。为什么呢?因为OceanBase中目前使用的是一种”静态执行计划“,无论什么Query,执行流程都一样。OB在前端代理ObConnector中实现绑定变量,将用户传入的变量进行to_string()操作,替代SQL语句中相应的部分,形成一个完整的SQL。然后这个SQL传递给MS,MS按照标准流程来解析和执行。相信不远的将来,OB将会实现真正意义上的绑定变量,让用户享受到绑定变量带来的好处。

C. java.sql.SQLException: ORA-01006: 绑定变量不存在

你system("SELECT name FROM Test WHERE FID="+paras[2]+" FOR UPDATE")这个出来,看下你拼接的,跟你测试的,是不是一摸一样。然后把system出来的这句,复制过去,看能执行不,肯定有拼接错误的,仔细看下

D. 拼的sql,怎么使用绑定变量

很多方法 1.自定义函数返回集合,然后用table,注意计划,可能要用rownum固定 2.正则表达式 3.INSTR+SUBSTR 4.SYS_CONTEXT 反正不管哪种方法,计划符合条件,可用到绑定变量,那么就可以了

E. 求已SQL语句报错的问题,报什么并非所有的变量都已绑定,代码在补充中:

报的错误是not all variables bound(并非所有的变量都已绑定)对吧?语句错误的来源是
'BEGIN SELECT count(carinfoid) INTO :1 FROM test ; END
这句话是作为一个语句来单独执行的,是脱离你这个过程,自己去执行的,把他单拿出来执行就会报这个错误。
如果你不动态执行它,应该就没问题了。而且INTO :1是什么?

F. 怎样察看没有使用绑定变量的sql语句

FORCE_MATCHING_SIGNATURE的值相同,而EXACT_MATCHING_SIGNATURE值不同,说明在cursor_sharing=force时,执行计划可共用;
cursor_sharing=exact时,执行计划不可共用;
实际上我们使用绑定变量后,同样也可以达到执行计划共用的效果。

G. 如何找出未使用绑定变量的SQL

可以看到insert into test.......这条语句竟然在shared pool里面解析了1000次,通过如下查询
select sql_text from v$sqlarea where sql_text like 'insert into test %';找出具体的sql代码,然后与开发人员商量,更改SQL代码。
上面只是一个简单的实例,具体要怎么查看你的应用是否使用了绑定变量,只需要简单修改
select substr(sql_text,1,20), count(*)
from v$sqlarea
group by substr(sql_text,1,20) having count(*) > 50;
可以将substr(sql_text,1,20) 改为substr(sql_text,1,30)等等,可以 having count(*) > 10,20,100等等。