【发布时间】:2016-09-28 13:53:17
【问题描述】:
下一条语句 SQL 给我一个“ORA-00984: column not allowed here”:
ALTER TABLE USUVCB.TVCB_RUT_SII ADD (Fecha_Inicio VARCHAR2(10 BYTE) DEFAULT TO_CHAR(SYSDATE, "YYYY-MM-DD") NOT NULL);
它变成了一个 PL-SQL,像这样:
SET SERVEROUTPUT ON
DECLARE
Fecha VARCHAR2(8) := TO_CHAR (SYSDATE, 'YYYYMMDD');
Tabla VARCHAR2(28) := 'USER.TABLE_' || Fecha;
BEGIN
SAVEPOINT START;
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE ' || Tabla || ' AS SELECT FIELD_1, FIELD_2, FIELD_3 FROM USER.TABLE';
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE('Error creating the table');
END;
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE USER.TABLE ADD (FIELD_4 VARCHAR2(10 BYTE) DEFAULT TO_CHAR (SYSDATE, "YYYY-MM-DD") NOT NULL)';
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE('Error creating the field');
END;
BEGIN
...
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE('...');
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Rollback');
ROLLBACK TO START;
END;
我希望它能够捕获 PL-SQL 中发生的所有异常,以便在出现任何错误时在检查点 START 处回滚。
【问题讨论】:
-
你为什么要添加一个
DATE列作为VARCHAR? -
事务(即
ROLLBACK)对您没有帮助,因为每个 DDL 命令在执行时会隐含COMMIT。 -
您将永远无法到达
DBMS_OUTPUT.PUT_LINE('Rollback');行,因为之前已处理所有异常。 -
字符串/字符值需要用单引号括起来。
"YYYY-MM-DD"是标识符,'YYYY-MM-DD'是字符常量 -
试着说服他这是个坏主意。
标签: sql oracle plsql oracle11g alter