Oracle 在托管变量中使用提示?

Oracle 在托管变量中使用提示?,oracle,oracle11g,hints,query-hints,Oracle,Oracle11g,Hints,Query Hints,全部, 我想在宿主变量中使用提示;事实上,我们需要使用提示的动态值,提示应该在运行时进行赋值。我们可以从以下内容编写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 P

全部,

我想在宿主变量中使用提示;事实上,我们需要使用提示的动态值,提示应该在运行时进行赋值。我们可以从以下内容编写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 
致:

hosted_hintp包含运行时需要的提示值


谢谢

您的查询必须使用动态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;
/

我不确定我是否理解上下文。您正在尝试绑定提示的文本吗?那是行不通的。在执行SQL语句之前,您可能会使用动态SQL来组装SQL语句—具体操作将取决于运行SQL语句的客户机所使用的语言。如果您使用的是SQL*Plus,则可能会使用替换变量。。。从根本上说,我强烈质疑这里的需求——使用这样的提示通常是个坏主意,动态提示更糟糕。Oracle有很多其他选项来操作计划。@感谢您的响应,我们的DAL支持Dynamicque语句,使用pro*C我们可以使用exec sql prepare dyn_stmt for select…,问题是Dynamicque有sql注入的风险。你怎么看?@Aymanadou-是的,如果你接受来自客户端的SQL来动态生成SQL语句,你将面临SQL注入的风险。这是该方法看起来是个坏主意的众多原因之一。Oracle有很多方法可以在不使用显式提示的情况下强制实现计划稳定性,使用其中一种方法似乎是合理的;
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;
/