为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java 查询中使用 SQL 提示

如何在 Java 查询中使用 SQL 提示

泛舟湖上清波郎朗 2021-05-31 13:15:24
刚刚听说“SQL 提示”可以优化查询结果或键入 SQL 查询时的处理时间。我找到了大量关于如何将这个概念实现到 Hibernate 中的信息,但没有找到关于如何将它与纯 Java 代码一起使用的信息。谁能帮我这个?我们正在使用以下代码:String value = "someValueToUseAsFilter";String query =  "SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/ "+                        " T.field AS table_field "+                        " FROM table T "+                        " WHERE T.field = ? "+                        "/";ResultSet rs = null;PreparedStatement stmt = null;try {        stmt = this.connection.prepareStatement(query);        stmt.setQueryTimeout(this.timeout);        stmt.setString(1, value);        rs = stmt.executeQuery();}catch (Exception e){        e.printStackTrace();        }接下来,eclipse 抛出以下异常:java.sql.SQLSyntaxErrorException: ORA-00936: missing expression查询已经过测试,如果直接针对数据库启动,它可以正常工作。但是在代码上使用它时会不断返回此错误。如果这可能的话,任何人都可以解释我吗?如果是这样,我如何在这种情况下使用它?
查看完整描述

1 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这/是一个用于结束和执行语句的客户端指令。您的错误与提示或 Java 无关,您只需要删除尾部斜杠即可。


您可以看到以其他方式运行语句的相同效果,例如作为匿名块中的动态 SQL:


set serveroutput on

declare

  query varchar2(4000);

begin

  query := q'[

SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/

T.field AS table_field

FROM your_table T

WHERE T.field = :var

/

]';

  dbms_output.put_line(query);

  execute immediate query;

end;

/

生成的语句打印为:


SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/

T.field AS table_field

FROM your_table T

WHERE T.field = :var

/

带有尾部斜杠,正如您所说,它将直接在客户端/IDE 中运行;但execute immediate得到与您相同的错误:


ORA-00936: missing expression

ORA-06512: at line 12

斜线被纯粹视为一个除法符号,因此它期待之后的另一个表达式 - 使该子句WHERE T.field = :var / <something>。


如果删除斜杠:


declare

  query varchar2(4000);

begin

  query := q'[

SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/

T.field AS table_field

FROM your_table T

WHERE T.field = :var

]';

  dbms_output.put_line(query);

  execute immediate query using 42;

end;

/

生成的语句现在没有它(显然),并且您没有收到错误:


PL/SQL procedure successfully completed.

(我应该选择到的东西-查询在这里仅分析,不会执行,但不要紧,这个例子)。


请注意,语句末尾也不需要分号,因为它是语句分隔符;添加一个会导致不同的错误,如 ORA-00911 无效字符。


查看完整回答
反对 回复 2021-06-02
  • 1 回答
  • 0 关注
  • 194 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信