在单个脚本中混合使用DDL和DML语句

时间:2015-09-18 06:42:43

标签: oracle

我正在编写一个脚本,它将向表中添加一个ID列,包括所有序列和触发器,以使其自动保持最新状态。它将执行以下操作:

  • 向表中添加列
  • 创建序列
  • 创建触发器
  • 更新现有行以使用序列值
  • 将字段设置为不可为空

我遇到的问题是粗体行 - 它是DDL脚本中的UPDATE语句。我得到的错误是:

  

PLS-00103:遇到符号“UPDATE”

我尝试将UPDATE包裹在BEGINEND块中,但没有成功。

是否可以在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);

1 个答案:

答案 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分配给每个现有行的顺序是不确定的