2017-03-05 127 views
0

我執行以下查詢的查詢:PLSQL - 執行都建在SELECT

SELECT 
'ALTER TABLE '||TABLE_NAME||' MODIFY ' || COLUMN_NAME || ' VARCHAR2('||DATA_LENGTH||' CHAR);' 
FROM 
    USER_TAB_COLUMNS 
WHERE 
    DATA_TYPE LIKE '%CHAR%' 
AND TABLE_NAME NOT LIKE '%VIEW' 
ORDER BY 
    TABLE_NAME, 
    COLUMN_NAME; 

輸出本身查詢改變我從選擇表「USER_TAB_COLUMNS」。 如:

ALTER TABLE ADM_FILTER_ELEMENT_REF_T MODIFY ELMNT_REF_CONTEXT VARCHAR2(1020 CHAR); 

我想知道我怎麼能抓住這個輸出和執行查詢? 查詢被設計爲在批處理文件中調用的.sql腳本中執行。

請指教。

+0

'執行immediate'想到的。 –

回答

4

您可以在匿名塊中循環查詢的結果並使用execute immediate來執行它們。

事情是這樣的:

begin 
    for q in (SELECT 
       'ALTER TABLE '||TABLE_NAME||' MODIFY (' || COLUMN_NAME || ' VARCHAR2('||DATA_LENGTH||'));' query 
       FROM 
        USER_TAB_COLUMNS 
       WHERE 
        DATA_TYPE LIKE '%CHAR%' 
       AND TABLE_NAME NOT LIKE '%VIEW' 
       ORDER BY 
        TABLE_NAME, 
        COLUMN_NAME 
       ) LOOP 
     execute immediate q.query; 
    end loop; 
end; 
/
+0

我不確定該陳述是否正確,但是,立即查詢是我想在一分鐘前提出的解決方案。 [EXECUTE IMMEDIATE聲明](https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems017.htm) – Shaq

+0

我試過你的解決方案,但我得到'ORA-01735:無效ALTER TABLE選項「錯誤。 –

+1

@DavidFaiz - 我提供瞭解決方案來展示如何使用結果。你的查詢語法有問題 - 修改後,該列和它的數據類型需要在括號內。更新了答案。 – GurV