2015-09-18 34 views
1

我正在寫一個腳本,它將向表中添加一個ID列,包括所有序列和觸發器以使其自動保持最新狀態。它將執行以下操作:在一個腳本中混合使用DDL語句和DML語句

  • 添加一列一個表
  • 創建序列
  • 創建觸發器
  • 更新現有行使用序列值
  • 設置字段不可空

我遇到的問題是用粗體顯示的行 - 這將是一個UPDATE DDL腳本中的語句。我得到的錯誤是:

PLS-00103:出現符號 「UPDATE」

我已經試過包裝在一個BEGINENDUPDATE,沒有成功。

是否可以在DDL腳本中包含UPDATE語句?

這是我到目前爲止有:

ALTER TABLE RETAILER ADD (RETAILER_ID NUMBER); 

CREATE SEQUENCE RETAILER_ID_SEQ; 

CREATE OR REPLACE TRIGGER RETAILER_ADD_TRG 
BEFORE INSERT ON RETAILER 
FOR EACH ROW 
BEGIN 
    SELECT RETAILER_ID_SEQ.NEXTVAL INTO :new.RETAILER_ID FROM dual; 
END; 

-- Doesn't like this part... 
UPDATE RETAILER SET RETAILER_ID = RETAILER_ID_SEQ.NEXTVAL; 
COMMIT; 

ALTER TABLE RETAILER MODIFY (RETAILER_ID NOT NULL); 
+3

在create trigger語句後面需要'/':http:// stackoverflow。 com/a/10207695/330315 –

+0

嗨@a_horse_with_no_name,你能寫這個答案,以便我可以接受嗎?乾杯。 – Eraph

回答

2

設置該值的有效的方法是:

UPDATE RETAILER SET RETAILER_ID = ROWNUM; 

...然後創建序列,讀取行的數RETAILER設置START WITH值(一些微不足道的PL/SQL和動態SQL)。

12C支持:

CREATE SEQUENCE RETAILER_ID_SEQ; 
ALTER TABLE RETAILER ADD (RETAILER_ID NUMBER DEFAULT RETAILER_ID_SEQ.NEXTVAL NOT NULL); 

...順便說一下,所以沒有必要定義自己的觸發器。

http://docs.oracle.com/database/121/SQLRF/statements_3001.htm

默認表達式可以包括序列僞列CURRVAL和NEXTVAL,只要序列存在,你有必要對其進行訪問的權限。執行使用DEFAULT表達式的後續插入的用戶必須具有該表的INSERT特權和序列上的SELECT特權。如果稍後刪除序列,則使用DEFAULT表達式的後續插入語句將導致錯誤。如果要在表中添加新列,那麼將NEXTVAL分配給每個現有行的順序是不確定的

+0

你是不是指'rownum'而不是'rowid'?我看不出一個'rowid'如何適合整數'retailer_id'列... –

+0

哈 - 當然是。只有清醒5分鐘。乾杯。 –

+0

在任何情況下,真正的問題是缺少'/'作爲@a_horse_with_no_name提到。然後這兩個解決方案都可以工作,但使用'RETAILER_ID_SEQ。NEXTVAL'而不是'ROWNUM'的優點是在UPDATE語句之後序列已經是最新的。 –