我正在编写一个脚本,它将向表中添加一个ID列,包括所有序列和触发器,以使其自动保持最新状态。它将执行以下操作:
我遇到的问题是粗体行 - 它是DDL脚本中的UPDATE
语句。我得到的错误是:
PLS-00103:遇到符号“UPDATE”
我尝试将UPDATE
包裹在BEGIN
和END
块中,但没有成功。
是否可以在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);
答案 0 :(得分: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
DEFAULT表达式可以包括序列伪列CURRVAL和NEXTVAL,只要序列存在并且您具有访问它所需的特权。执行使用DEFAULT表达式的后续插入的用户必须对表具有INSERT特权,并且对序列具有SELECT特权。如果稍后删除序列,则使用DEFAULT表达式的后续insert语句将导致错误。如果要向表中添加新列,则将NEXTVAL分配给每个现有行的顺序是不确定的