2015-05-26 30 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語句的客戶端所使用的語言。如果您使用的是SQL * Plus,你可以使用替換變量......基本上,我強烈質疑這裏的要求 - 使用這樣的提示通常是一個壞主意,動態提示更糟糕。甲骨文有很多其他的選擇來操縱計劃。 –

+0

當然可以,編碼動態SQL。我會給你寫一個快速的代碼作爲例子。 –

+0

@JustinCave感謝您的迴應,我們的DAL支持dynamique語句,使用pro * C我們可以使用exec sql prepare dyn_stmt來選擇...., 問題是(對於動態的)它將是SQL注入的風險。你怎麼看? – Aymanadou

回答

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';

- 處理

END;

/

+0

我們正在使用PRO * C EXEC SQL PREPARE語句的動態語句名稱 FROM {:host_string |字符串字面量 }; – Aymanadou