2014-01-20 18 views
0

我現在有一個分配給uni的地方,我需要編寫一個數據庫變更腳本,然後是一個回滾腳本。我也應該做一些簡單的檢查,看是否已完成更改。我花了很多時間編寫腳本,因爲我對plsql不熟練。該prodcut是在這裏:編寫一個PL SQL變更腳本(sql developer/oracle)

-- the check could be more extensive, e.g. checking the type of the column 
declare 
    titleExists number; 
begin 
    select count(*) into titleExists 
    from user_tab_columns 
    where table_name = 'TITLE' 
    and column_name = 'TITLE'; 

    if titleExists > 0 then 
    execute immediate 'alter table title rename column title to name'; 
    end if; 
end; 
/

declare 
    typeExists number; 
begin 
    select count(*) into typeExists 
    from user_tab_columns 
    where table_name = 'TITLE' 
    and column_name = 'TYPE' 
    and data_type = 'CHAR'; 

    if typeExists > 0 then 
    execute immediate 'alter table title add (new_type varchar2(12) check (new_type in (''business'', ''mod_cook'', ''psychology'', ''popular_comp'', ''trad_cook'')))'; 

    execute immediate 'update title set new_type = trim(type)'; 

    execute immediate 'alter table title modify (new_type not null)'; 

    execute immediate 'alter table title drop column type'; 

    execute immediate 'alter table title rename column new_type to type'; 
    end if; 
end; 
/

第一部分重命名的列和所述第二部分改變列型,並增加了支票,基本上變成char列到枚舉。

我真的很想知道,我需要把每一個變化都立即執行。有沒有更簡單的方式來寫這個?

+0

對於頂級標記不要忘記添加異常處理;) –

+0

哈哈,螺絲異常處理。我只會在那裏添加註釋,例如「應該有異常處理」。此外這項任務沒有被標記,它是要麼完成或不是:) – Santhos

回答

0

有許多與腳本問題,但保持自己有限的問題是否使用立即執行:

是不是真的有寫這個的一個簡單的方法。 PL/SQL正在修改它運行的數據庫,所以添加例如update title作爲PL/SQL中的硬編碼部分是不可能的(它不會編譯)。

此外,有時可能會合並多個語句,這些語句是通過在一個大的PL/SQL中執行立即執行而發送的。但PL/SQL本身不支持DDL語句,所以你需要一些動態SQL的方法。

還要注意,每個DDL都會執行一個隱式提交,因此您的更新始終由以下alter table語句執行並提交。

我認爲你已經做得很好,成爲你的第一個PL/SQL任務。

+0

我知道必須有大量的問題。但是,這是一個學校作業。我不願意花兩年的時間。是否有任何示例如何在oracle數據庫中編寫適當的更改腳本?這必須以某種方式在公司中完成。最後,感謝最後一句話。它在Google搜索時間和分鐘編碼之後使我興奮起來:) – Santhos

+0

@Santhos是的,我們根據自1999年以來的配置管理問題開發了一個適當的更改腳本......但它非常複雜,PL/SQL和超過600 KB的包(加上我不能與你分享)。大多數運行Oracle的公司不會自動化數據庫更改模型。有些人會這樣做,這取決於他們DBA的技能。還有很多軟件公司。你能更具體地說明你所缺少的東西嗎?也許我可以幫忙。 –

+0

我知道你不能分享它。我其實並沒有錯過任何具體的東西。我只是很棒。謝謝你的幫助。 – Santhos