更改 table,添加列/ORA-00984:此处不允许列 PLSQL
Alter table, add column / ORA-00984: column not allowed here PLSQL
下一个语句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 中发生的所有异常,以便在出现任何错误时可以在检查点开始时回滚。
格式掩码需要使用单引号:
ALTER TABLE USUVCB.TVCB_RUT_SII ADD (Fecha_Inicio VARCHAR2(10 BYTE) DEFAULT TO_CHAR(SYSDATE, 'YYYY-MM-DD') NOT NULL);
在 EXECUTE 中,这将是:
execute immediate 'ALTER TABLE USUVCB.TVCB_RUT_SII ADD (Fecha_Inicio VARCHAR2(10 BYTE) DEFAULT TO_CHAR(SYSDATE, ''YYYY-MM-DD'') NOT NULL)';
请注意,您正在执行 DDL 查询,因此您将无法回滚所做的修改。回滚只影响数据,不影响结构。
此外,为什么要将日期存储在 varchar
列中?这是个坏主意,date
列
会好得多
Aleksej 有一个很好的解决方案。 Oracle 的一个经常被忽视的特性是 q 引用。通过使用此功能,您可以使用单引号。这是与 q 引用相同的答案:
EXECUTE immediate q'[ALTER TABLE USUVCB.TVCB_RUT_SII ADD (Fecha_Inicio VARCHAR2(10 BYTE) DEFAULT TO_CHAR(SYSDATE, 'YYYY-MM-DD') NOT NULL)]';
我得到了我的解决方案:
我正在使用
ALTER TABLE PG_PGS_MST_LABEL MODIFY (LANG_CODE DEFAULT EN );
但是
我的解决方案是 Lang_CODE 列是 varchar2,我必须在 EN 中使用单个代码,即
ALTER TABLE PG_PGS_MST_LABEL MODIFY (LANG_CODE DEFAULT 'EN' );
谢谢。
下一个语句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 中发生的所有异常,以便在出现任何错误时可以在检查点开始时回滚。
格式掩码需要使用单引号:
ALTER TABLE USUVCB.TVCB_RUT_SII ADD (Fecha_Inicio VARCHAR2(10 BYTE) DEFAULT TO_CHAR(SYSDATE, 'YYYY-MM-DD') NOT NULL);
在 EXECUTE 中,这将是:
execute immediate 'ALTER TABLE USUVCB.TVCB_RUT_SII ADD (Fecha_Inicio VARCHAR2(10 BYTE) DEFAULT TO_CHAR(SYSDATE, ''YYYY-MM-DD'') NOT NULL)';
请注意,您正在执行 DDL 查询,因此您将无法回滚所做的修改。回滚只影响数据,不影响结构。
此外,为什么要将日期存储在 varchar
列中?这是个坏主意,date
列
Aleksej 有一个很好的解决方案。 Oracle 的一个经常被忽视的特性是 q 引用。通过使用此功能,您可以使用单引号。这是与 q 引用相同的答案:
EXECUTE immediate q'[ALTER TABLE USUVCB.TVCB_RUT_SII ADD (Fecha_Inicio VARCHAR2(10 BYTE) DEFAULT TO_CHAR(SYSDATE, 'YYYY-MM-DD') NOT NULL)]';
我得到了我的解决方案:
我正在使用
ALTER TABLE PG_PGS_MST_LABEL MODIFY (LANG_CODE DEFAULT EN );
但是
我的解决方案是 Lang_CODE 列是 varchar2,我必须在 EN 中使用单个代码,即
ALTER TABLE PG_PGS_MST_LABEL MODIFY (LANG_CODE DEFAULT 'EN' );
谢谢。