【问题标题】:using Hint in a hosted variable?在托管变量中使用提示?
【发布时间】: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


【解决方案1】:

您的查询必须使用动态 SQL 执行。 像这样的:

CREATE OR REPLACE PROCEDURE query_emp (a_hint VARCHAR2)
AS
    TYPE cur_typ IS REF CURSOR; c cur_typ;
BEGIN
    OPEN c FOR 'SELECT ' || a_hint || ' empno, ename, sal, job
                FROM emp WHERE empno = 7566';

    -- process
END;
/

【讨论】:

  • 我们使用动态语句与 PRO *C EXEC SQL PREPARE statement_name FROM { :host_string | string_literal };
猜你喜欢
  • 2017-04-02
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多