2015-05-26 4 views
1

Все,с использованием подсказки в размещенной переменной?

Я хочу использовать подсказку в размещенной переменной; на самом деле нам нужно использовать динамическое значение подсказки (подсказка должна оцениваться во время выполнения). мы можем написать 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 содержат значение подсказки нам нужно во время выполнения.

спасибо

+5

Я не уверен, что я понимаю контекст. Вы пытаетесь связать текст подсказки? Это не сработает. Вы можете потенциально использовать динамический SQL для сборки инструкции SQL перед ее выполнением - специфика этого будет зависеть от языка, на котором написан клиент, с которым вы работаете SQL. Если вы используете SQL * Plus, вы, вероятно, могли бы использовать переменную замещения ... В основном, я бы поставил под сомнение это требование - используя такие подсказки, как это, как правило, плохая идея, динамические подсказки хуже. Oracle имеет множество других возможностей для управления планами. –

+0

Конечно, вы можете, кодируя динамический SQL. В качестве примера я напишу вам быстрый код. –

+0

@JustinCave Спасибо за ответ, наш DAL поддерживает операторы dynamique, с pro * C мы можем использовать exec sql подготовить dyn_stmt для выбора ...., Проблема в том, что (для dynamique) это будет риск SQL-инъекции. что вы думаете? – Aymanadou

ответ

1

Ваш запрос должен быть выполнен с использованием динамического SQL. Нечто подобное:

CREATE OR REPLACE PROCEDURE query_emp (a_hint VARCHAR2)

как тип cur_typ

IS REF CURSOR; c cur_typ;

BEGIN OPEN c FOR 'SELECT' || a_hint || 'empno, ename, sal, вакансия

От emp ГДЕ empno = 7566';

- процесс

END;

/

+0

мы используем динамический statment с PRO * C EXEC SQL PREPARE statement_name FROM {: host_string | string_literal}; – Aymanadou

 Смежные вопросы

  • Нет связанных вопросов^_^