谷歌搜索了很多,没有找到我正在寻找的东西,我决定问这个问题.
我正在使用绑定变量,正如2005年这篇名为The Mark That Bind by Mark A. Williams的精彩文章所示,如下所示:
OracleParameter p_APP_NAME =
new OracleParameter("p_APP_NAME", OracleDbType.NVarchar2, ParameterDirection.Input);
p_APP_NAME.Size = 50;
p_APP_NAME.Value = log.Application.Name;
cmd.Parameters.Add(p_APP_NAME);
Run Code Online (Sandbox Code Playgroud)
我成功启用了ODP.NET调试跟踪,但缺少的一个关键信息是记录的SQL statement不会显示绑定到绑定变量的值是什么.
它是记录OracleCommand.CommandText但没有OracleCommand.Parameters值.它告诉我这个:
TIME:2013/09/20-22:59:21:890 TID:20fc OpsSqlPrepare2(): SQL: UPDATE PS_LOG SET
APP_NAME = :p_APP_NAME,
WHERE LOG_ID = :p_LOG_ID
Run Code Online (Sandbox Code Playgroud)
我真正想看到的是发送到ORACLE服务器的查询中使用的实际值,如下所示:
TIME:2013/09/20-22:59:21:890 TID:20fc OpsSqlPrepare2(): SQL: UPDATE PS_LOG SET
APP_NAME = 'App Name',
WHERE LOG_ID = 777
Run Code Online (Sandbox Code Playgroud)
我错过了一些配置或我想要的信息在使用ODP.NET跟踪功能时不可用吗?
如果这不是内置的,我想我将不得不实现自己的替换方法并记录SQL Statement自己.
我听说使用绑定变量(可以)更有效,因为对于具有不同绑定值的后续调用,查询本身仍然相同,因此不再需要对其进行解析。
我理解为什么固定值会出现这种情况。在下面的游标中,该值固定为 1。如果我有一个相同的不同游标,除了 1 变为 2,这是一个不同的查询。清到此为止。
declare
cursor C_CURSOR is
select * from TESTTABLE pt where pt.ID = 1;
Run Code Online (Sandbox Code Playgroud)
但我想知道在游标内使用 PL/SQL 变量时是否也是这种情况。它们是否被扩展为一个固定值,或者它们是否被解释为绑定变量。
我已经进行了广泛的搜索,但到处都可以找到有关文字的示例,如上述情况,但没有明确解释 PL/SQL 变量的使用。
换句话说,在下面的两个片段中,第二个可能更有效,还是它们本质上相同?
直接在游标中使用 PL/SQL 变量:
declare
V_TEST integer := 1;
cursor C_CURSOR is
select *
from
TESTTABLE pt
where
pt.ID = V_TEST;
begin
for r in C_CURSOR loop
null;
end loop;
end;
Run Code Online (Sandbox Code Playgroud)
使用绑定变量:
declare
V_TEST int := 1;
cursor C_CURSOR(B_TEST int) is
select *
from
TESTTABLE pt
where
pt.ID = B_TEST;
begin
for r …Run Code Online (Sandbox Code Playgroud) 在我的 PL/SQL 中有这个使用绑定变量的大动态 SQL。我使用 DBMS_SQL 包来绑定和执行生成的查询。
根据某些标准,将 where 子句添加到动态 SQL 中。当我只使用“in”或“=”来匹配我的绑定变量时,一切正常,结果返回速度非常快。
例子:
(servedparty = :bv_ or servedpartyimsi = :bv_)
但是,当我执行以下操作时:
(servedpartyimei like :bv_)
Run Code Online (Sandbox Code Playgroud)
并提供一个像 12345679890% 这样的值,查询需要非常非常长的时间。
我也试过这样的事情
(servedpartyimei like :bv_||'%')
然后提供没有 '%' 的值,但它给出了相同的结果
当我在没有绑定变量的情况下执行查询但只放置硬编码值时,结果也会立即返回。
我在这里做错了吗?不要像 LIKE 运算符那样绑定变量?有任何想法吗?
谢谢你。
我在PL/SQL块中设置了一个绑定变量,我试图在另一个查询的IN表达式中使用它.像这样的东西:
variable x varchar2(255)
declare
x varchar2(100);
begin
for r in (select id from other_table where abc in ('&val1','&val2','&val3') ) loop
x := x||''''||r.id||''',';
end loop;
--get rid of the trailing ','
x:= substr(x,1,length(x)-1);
select x into :bind_var from dual;
end;
/
print :bind_var;
select *
from some_table
where id in (:bind_var);
Run Code Online (Sandbox Code Playgroud)
我在尝试使用"IN"列表中的绑定变量的查询中收到错误(ORA-01722:无效数字).
打印声明yiels '123','345'这是我所期望的.
是否可以像这样使用绑定变量,还是应该尝试不同的方法?
(使用Oracle 10g)
澄清:
这是一种和解的事情.我想跑
select *
from some_table
where id in (select id from other_table where abc in ('&val1','&val2','&val3'))
Run Code Online (Sandbox Code Playgroud)
在脚本的主要部分(此处未图示)之前删除了一大堆记录.我想在之后再次运行它以验证some_table还没有删除记录.但是,other_table …
我已经将jooq与spring集成在一起,并且对于所有类型的数据库查询(MySQL),我都使用spring的JDBC模板。这里使用jooq库来生成传递给jdbc模板的sql查询。
尽管我的其余查询工作正常,直到我向查询添加限制和/或偏移量为止。
我正在生成查询,如下所示:
create.select(Factory.field("table_name"))
.from("tables t")
.where("t.table_schema LIKE '" + schemaName + "'")
.limit(10)
.offset(2)
.getSQL();
Run Code Online (Sandbox Code Playgroud)
我收到如下错误:
org.springframework.jdbc.BadSqlGrammarException:StatementCallback; 错误的SQL语法[从表t中选择table_name,其中(t.table_schema LIKE'test')有限制吗?偏移量?]; 嵌套的异常是com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误。检查与您的MySQL服务器版本相对应的手册,以获取在'?附近使用的正确语法。抵消了?在第1行
显然,传递给limit和offset方法的值未附加到查询中。
我搜索了文档,但没有找到其他实现此目的的方法。
这个问题可能更适合DB stackexchange站点,但我不确定.
无论如何,我正在处理优化查询,并且我了解到使用绑定变量会使解析器无法正常工作.我们已经看到正在运行的查询有所改进,但我想知道是否将我们的软件传入的静态变量用于绑定变量也是有帮助的.这是一个例子:
select *
from report
where report.name = :1
and report.enabled = '1'
Run Code Online (Sandbox Code Playgroud)
我可以说出来
select *
from report
where report.name = :1
and report.enabled = :2
Run Code Online (Sandbox Code Playgroud)
我只是做出改变,但是在软件中实际执行它并看到它所带来的差异的过程有点漫长而乏味.有没有人知道混合文字(如第一个例子中)是否会损害优化器效率,即使它们始终相同?
提前致谢.
嗨我在尝试找到oracle中绑定感知游标匹配的简单解释时遇到了一些麻烦.绑定感知游标匹配基本上是Oracle监视带有绑定变量的查询随着时间的推移并查看使用时是否有增加的CPU变量.然后从这样做它几乎生成一个更合适的执行计划,然后说全表扫描然后将查询标记为绑定意识,然后在下次执行查询时,可以选择两个执行计划?任何帮助将不胜感激!干杯!
我正在使用 SQL Developer。当我想绑定值时。通常我使用以下语法:
SELECT * FROM table WHERE column = :bindvalue
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何在字符串中做到这一点。以下查询不起作用。
SELECT * FROM table WHERE column like '%:bindvalue%'
Run Code Online (Sandbox Code Playgroud)
为什么我需要它?因为我的程序在 python 中运行一个查询并分配一些东西给绑定变量:
curr.execute('''SELECT * FROM table WHERE column''' = :bindvalue, bindvalue=somevalue)
Run Code Online (Sandbox Code Playgroud)