2015-04-17 120 views
2

我有一個表A有列A保存表名稱值。 所有這些表都有一個共同的列C。我需要每個表格的這個列的最大值。PLSQL動態查詢

我試過這個使用動態SQL,但我得到的錯誤。請建議。

DECLARE  
query1 VARCHAR2(100); 
c_table VARCHAR2(40); 
c_obj VARCHAR2(20); 
Cursor cursor_a IS 
SELECT a FROM A; 
BEGIN 
Open cursor_a; 
    LOOP 
     Fetch cursor_a INTO c_table2;  
     EXIT WHEN cursor_a%notfound;  
     query1 := 'SELECT max(object_ref) AS "c_obj" FROM c_table' ; 
     EXECUTE IMMEDIATE query1; 
     dbms_output.put_line('Maximum value: '|| c_table || c_obj); 
    END LOOP; 
Close cursor_a; 
END; 
+0

「*,但得到的錯誤*」 - 和錯誤? –

回答

-4

有在veriables一些錯過的比賽,你曾使用過即

  1. 聲明爲 「c_table」,但訪問爲 「c_table2
  2. 每個表常見的列名是「 C「但是作爲」object_ref「訪問
  3. 在動態查詢中SE INTO關鍵字的值存儲到您的varibale

建議

  1. 使用CONCAT()函數來準備查詢動態即是這樣的:

    SET @SQL: = CONCAT('SELECT max(c)INTO',c_obj,'FROM',c_table);實現動態查詢

  2. 步驟是:

    SET @SQL = <your dynamic query> 
    PREPARE stmt FROM @SQL; 
    EXECUTE stmt; 
    

示例代碼:

DECLARE  
query1 VARCHAR2(100); 
c_table VARCHAR2(40); 
c_obj VARCHAR2(20); 
CURSOR cursor_a IS 
SELECT a FROM A; 
BEGIN 
OPEN cursor_a; 
    LOOP 
     FETCH cursor_a INTO c_table;  
     EXIT WHEN cursor_a%notfound; 
     SET @SQL := CONCAT('SELECT max(object_ref) AS c_obj INTO ', c_obj, ' FROM ',c_table); 
    PREPARE stmt FROM @SQL;   
    EXECUTE stmt;  
    dbms_output.put_line('Maximum value: '|| c_table || c_obj); 
    END LOOP; 
CLOSE cursor_a; 
END; 
+0

這是無效的Oracle PL/SQL語法 – APC

+0

是的它是運行動態查詢的示例方式(參考語法:用於MySQL兼容),您根據使用的數據庫進行需求更改,即Oracle –

+1

StackOverflow有很多MySQL問題。爲什麼不回答一些呢?除非您想以此爲契機,通過用實際符合OP要求**的解決方案回答問題來自學Oracle PL/SQL。 – APC

2

動態SQL不能看到你的PL/SQL變量:你需要傳遞它是一個可以在SQL引擎範圍內執行的字符串。因此,你需要用下面的語句的樣板文本來連接表名:

query1 := 'SELECT max(c) FROM ' || variable_name; 

您還需要查詢的結果返回到一個變量。

這裏是它是如何工作(我從你的榜樣剝離掉一些不必要的代碼):

DECLARE  
c_table VARCHAR2(40); 
c_obj VARCHAR2(20); 
BEGIN 
    for lrec in (select a as tab_name from A) 
    LOOP 
     EXECUTE IMMEDIATE 'SELECT max(object_ref) FROM ' || lrec.tab_name 
      into c_obj ; 
     dbms_output.put_line('Maximum value: '|| lrec.tab_name 
      || '='|| c_obj); 
    END LOOP; 
END; 
+0

由於OP的陳述「*所有這些表都有一個共同的列'C' *」它應該是'EXECUTE IMMEDIATE'SELECT max(C)FROM'|| lrec.tab_name轉換成c_obj;' –

+0

@Wernfried - 好點 – APC