【发布时间】:2015-05-26 16:07:56
【问题描述】:
全部,
我想在托管变量中使用提示;实际上,我们需要使用一个动态的提示值(Hint 应该在运行时被赋值)。我们可以从这里写一个sql语句吗:
SELECT /*+ ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b)
USE_NL (glcc glf) USE_MERGE (gp gsb) */
b.application_id ,
b.set_of_books_id ,
b.personnel_id,
p.vendor_id Personnel,
p.segment1 PersonnelNumber,
p.vendor_name Name
FROM jl_br_journals j,
jl_br_balances b,
gl_code_combinations glcc,
fnd_flex_values_vl glf,
gl_periods gp,
gl_sets_of_books gsb,
po_vendors p
WHERE
到:
SELECT /*+ :hosted_hintp */
b.application_id ,
b.set_of_books_id ,
b.personnel_id,
p.vendor_id Personnel,
p.segment1 PersonnelNumber,
p.vendor_name Name
FROM jl_br_journals j,
jl_br_balances b,
gl_code_combinations glcc,
fnd_flex_values_vl glf,
gl_periods gp,
gl_sets_of_books gsb,
po_vendors p
WHERE
hosted_hintp 包含我们在运行时需要的提示值。
谢谢
【问题讨论】:
-
我不确定我是否理解上下文。您是否尝试绑定提示的文本?那是行不通的。在执行 SQL 语句之前,您可能会使用动态 SQL 来组装它——具体情况取决于您运行 SQL 语句的客户端所用的语言。如果您使用的是 SQL*Plus,您可能可以使用替换变量...从根本上说,我强烈质疑这里的要求-使用这样的提示通常是一个坏主意,动态提示更糟。 Oracle 有很多其他选项来操纵计划。
-
@JustinCave 感谢您的回复,我们的 DAL 支持动态语句,使用 pro *C 我们可以使用 exec sql prepare dyn_stmt for select ....,问题是(对于动态)这将是一个风险SQL注入。你怎么看?
-
@Aymanadou - 是的,如果您从客户端接受 SQL 以动态生成 SQL 语句,您将面临 SQL 注入的风险。这是该方法似乎是个坏主意的众多原因之一。 Oracle 有很多方法可以在不使用显式提示的情况下强制计划稳定性,使用其中一种替代方法似乎是合理的。
标签: oracle oracle11g hints query-hints