views:

227

answers:

2

hi

I want to call create table/ alter table command from a procedure. Is it possible?

My requirement is to change the datatype of a column in all tables. So, I am just getting the column name from user_tab_cols. Now I want to create a temp table which requires create statement .. but i am unable to use that within a proc.

Can anyone please help me out?

A: 

you can generate the query as string and execute it with 'exec' keyword.

Fedor Hajdu
`exec` is SQL*Plus, not PL/SQL
Jeffrey Kemp
The OP did not mention Oracle originally. A sufficiently knowledgeable person could infer it from the presence of `user_tab_columns` but this reply is innocent.
Dan
innocent, but not very helpful :)
Jeffrey Kemp
+9  A: 

I presume from the reference to USER_TAB_COLUMNS that this is Oracle. ALTER and CREATE statements are DDL, which we cannot execute directly in PL/SQL. However, there are a couple of ways around this restriction: EXECUTE IMMEDIATE and DBMS_UTILITY.EXEC_DDL(). I will use EXECUTE IMMEDIATE in the following example.

begin
    for lrec in ( select table_name from user_tab_columns
                  where column_name = 'UNIVERSAL_COLUMN_NAME')
    loop
        execute immediate 'alter table '||lrec.table_name||
                               ' modify UNIVERSAL_COLUMN_NAME varchar2(255)';
    end loop;
end;

Note that the usual restrictions apply: the new datatype has to be compatible with the existing datatype (unless the column is empty), and things are trickier with some specilaized datatypes like CLOBs.

edit

I haven't addressed the CREATE TABLE statement. The principle is the same, it is just longer to type out. Besides, I am not entirely clear how it applies to your prior requirement to change the datatype of those columns.

APC
thanks .. i used that one.. and its working absolutely fine.thanks a lot
Mrityunjay
If you're using it and it's working then please mark the answer as accepted (click on the big check to the left of it to make it green.)
Tom H.