2017-03-05 75 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