2013-08-23 82 views
0

我正在創建一個plslq程序。因爲查詢需要根據指定的表名動態生成。我能夠在一個變量中生成查詢。我的問題是如何使用plsql在變量中執行查詢。執行/執行立即在此處不起作用。執行變量拋出錯誤

DECLARE 
     f UTL_FILE.FILE_TYPE; 
     s VARCHAR2(200); 
     c number:=0; 
    query varchar(32767); 
    BEGIN 
--Reading and getting the value from a text file. The text file contains lot of table names 
     f := UTL_FILE.FOPEN('DATADIR_EXP1','Table.txt','R'); 
     LOOP 
     UTL_FILE.GET_LINE(f,s); 
     DBMS_OUTPUT.PUT_LINE(s); 
     IF C <> 0 THEN 
     query := query || ' UNION ALL'; 
     END IF; 
--Query is generated here. 
     query := query || ' SELECT '''||s||''' AS TABLE_NAME,MIn(Updated_Time) AS MIN_VALUE,MAX(Updated_Time) AS MAX_VALUE,count(*) AS NUMBER_OF_ROWS FROM ' || s ; 
     c:=c+1; 
     END LOOP; 
    EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      UTL_FILE.FCLOSE(f); 
      DBMS_OUTPUT.PUT_LINE('Number of lines: ' || c); 
    DBMS_OUTPUT.PUT_LINE(query); 
-- The problem is here. Execute/Execute Immediate is not working. 
    EXECUTE IMMEDIATE(query); 
      UTL_FILE.FCLOSE(f); 
    END; 
    /

如何完成此任務。我只需要執行查詢。

+0

好吧,你得到什麼錯誤?你的結果需要以某種方式返回。 – OldProgrammer

+0

簡單地「執行」SELECT語句沒有意義。你必須要用它做點什麼。那麼,你是否想將所有數據讀入一個類型,返回一個打開的光標等? – Ben

回答

0

您需要將SELECT語句的輸出列綁定到某些輸出變量。否則,您只是執行該語句,並且不返回任何內容。這裏有一個例子:

DECLARE 
    v1 NUMBER (10); 
    v2 VARCHAR2 (20); 
BEGIN 
    EXECUTE IMMEDIATE 'select 1, ''hello'' from dual' INTO v1, v2; 

    DBMS_OUTPUT.put_line ('v1 = ' || v1); 
    DBMS_OUTPUT.put_line ('v2 = ' || v2); 
END; 

(輸出)

v1 = 1 
v2 = hello 

此,如果你正在返回一行纔有效。如果查詢返回多行,則需要將結果打開到遊標中。例如:

DECLARE 
    TYPE EmpCurTyp IS REF CURSOR; -- define weak REF CURSOR type 
    emp_cv EmpCurTyp; -- declare cursor variable 
    my_ename VARCHAR2(15); 
    my_sal NUMBER := 1000; 
BEGIN 
    OPEN emp_cv FOR -- open cursor variable 
     'SELECT ename, sal FROM emp WHERE sal > :s' USING my_sal; 
    ... 
END; 

請參閱Oracle documentation

+0

如果有多行,你也可以批量收集到一個類型;這恰當取決於SELECT的結果將如何使用,我們還沒有被告知...... – Ben

相關問題