2013-03-22 209 views
0

我想用另一個變量定義一個變量。目的是在運行時替換變量中的值。如何在oracle中使用另一個變量定義一個變量sql

我不確定我是否問正確的問題或說明正確的例子。

DECLARE param1 VARCHAR(10); 
DECLARE param2 VARCHAR(10); 
DECLATE tempVar VARCHAR(1):= 'A'; 
DECLARE query VARCHAR(200) := 'select * from tmp_table where col1 = <variable>'; 

BEGIN 
    IF tempVar = 'A' THEN 
    -- EXECUTE IMMEDIATE query using param 1; 
    ELSE 
    -- EXECUTE IMMEDIATE query using param 2; 
    END IF; 
    END; 

回答

2
DECLARE 
    type tmp_table_arr is table of tmp_table%type; 
    l_temps tmp_tabe_arr; 

    param1 VARCHAR(10); 
    param2 VARCHAR(10); 
    tempVar VARCHAR(1):= 'A'; 
    query VARCHAR(200) := 'select * from tmp_table where col1 = :val'; 

BEGIN 
    IF tempVar = 'A' THEN 
    EXECUTE IMMEDIATE query 
     BULK COLLECT INTO l_temps 
     using param1; 
    ELSE 
    EXECUTE IMMEDIATE query 
     BULK COLLECT INTO l_temps 
     using param2; 
    END IF; 
END; 

在語法上是有效的,如果tmp_table存在,並且有一列col1將工作。但是,在這種情況下沒有理由使用動態SQL。你也不需要兩個不同的SQL語句

DECLARE 
    param1 VARCHAR(10); 
    param2 VARCHAR(10); 
    tempVar VARCHAR(1):= 'A'; 
BEGIN 
    FOR i IN (SELECT * 
       FROM tmp_table 
      WHERE col1 = (CASE WHEN tempVar = 'A' 
           THEN param1 
           ELSE param2 
          END)) 
    LOOP 
    <<do something>> 
    END LOOP; 
END; 
+0

這會工作,但是,什麼我在不同的變量尋找具體運行時間變量替換。我有一個查詢,我需要在不同的表上查詢20次。除表名外,沒有任何變化。我已經用我的基本查詢聲明瞭變量。我想我需要的是一種修改我的變量來替換表名並執行結果查詢的方法。 – 2013-03-22 01:12:45

+0

讀取你的第一個過程:val在運行時被替換爲l_temps的值? – 2013-03-22 01:16:50

+0

@FarhanSyed - ':val'是一個綁定變量,因此'param1'中的值在運行時使用。 'l_temps'是存儲'SELECT'語句結果的集合。綁定變量用於改變您在謂詞中使用的值。在你的問題中,你正在討論動態地改變謂詞中的值。如果你真的想改變查詢表,那是完全不同的問題。你不能使用表名的綁定變量。在執行之前,您必須動態組裝SQL語句。 – 2013-03-22 04:07:05

相關問題