Alter table,add column/ORA-00984:此处不允许列PLSQL
下一条SQL语句给了我一个“ORA-00984:此处不允许列”: 它被转换成PL-SQL,如下所示:Alter table,add column/ORA-00984:此处不允许列PLSQL,sql,oracle,plsql,oracle11g,alter,Sql,Oracle,Plsql,Oracle11g,Alter,下一条SQL语句给了我一个“ORA-00984:此处不允许列”: 它被转换成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 T
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 immediate 'ALTER TABLE USUVCB.TVCB_RUT_SII ADD (Fecha_Inicio VARCHAR2(10 BYTE) DEFAULT TO_CHAR(SYSDATE, ''YYYY-MM-DD'') NOT NULL)';
请注意,您正在执行DDL查询,因此无法回滚所做的修改。回滚只影响数据,而不影响结构
此外,为什么要在
varchar
列中存储日期?这是个坏主意,最好是日期
列格式掩码需要使用单引号:
ALTER TABLE USUVCB.TVCB_RUT_SII ADD (Fecha_Inicio VARCHAR2(10 BYTE) DEFAULT TO_CHAR(SYSDATE, 'YYYY-MM-DD') NOT NULL);
在执行中,这将是:
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
列中存储日期?这是一个坏主意,最好是一个日期列Aleksej有一个好的解决方案。甲骨文的一个经常被忽视的特性是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)]';
Aleksej有一个很好的解决方案。甲骨文的一个经常被忽视的特性是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(语言代码默认为EN)代码>
但是
我的解决方案是Lang_代码列是varchar2,我必须在EN中使用单个代码,即
ALTER TABLE PG_PGS_MST_LABEL MODIFY (LANG_CODE DEFAULT 'EN' );
谢谢。我得到了我的解决方案:
我正在使用
ALTER TABLE PG_PGS_MST_LABEL MODIFY(语言代码默认为EN)代码>
但是
我的解决方案是Lang_代码列是varchar2,我必须在EN中使用单个代码,即
ALTER TABLE PG_PGS_MST_LABEL MODIFY (LANG_CODE DEFAULT 'EN' );
谢谢。我将日期存储到一个varchar中,以便将其用于备份表的名称中。如果发生错误,是否有任何方法可以回滚?回滚不是正确的方法。一个简单的方法是为您执行的每个语句构建一个revert语句,将它们存储在某个变量中,然后在出现错误时运行它们。在这种情况下,我可以捕获外部异常中出现的任何错误吗?您可以按需任何方式处理异常;您只需将回滚替换为扫描语句数组并运行它们,您只需处理字符串中的单个引号;刚才向您展示了将日期存储到varchar中的方法,可以将其用于备份表的名称中。如果发生错误,是否有任何方法可以回滚?回滚不是正确的方法。一个简单的方法是为您执行的每个语句构建一个revert语句,将它们存储在某个变量中,然后在出现错误时运行它们。在这种情况下,我可以捕获外部异常中出现的任何错误吗?您可以按需任何方式处理异常;您只需将回滚替换为扫描语句数组并运行它们,您只需处理字符串中的单个引号;刚才向您展示了为什么要将DATE
列添加为VARCHAR?事务(即ROLLBACK
)对您没有帮助,因为每个DDL命令在执行时都会隐式地执行COMMIT
。您永远不会到达行DBMS\u输出。PUT\u行(“ROLLBACK”)代码>因为所有异常都是在前面处理的。字符串/字符值需要放在单引号中<代码>“YYYY-MM-DD”
是一个标识符,“YYYY-MM-DD”
是一个字符恒常地让他相信这是个坏主意。你为什么要添加一个日期
列作为VARCHAR?事务(即回滚
)对你没有帮助,因为每个DDL命令在执行时都会执行一个隐式的COMMIT
。您永远不会到达行DBMS\u输出。PUT\u行('Rollback')代码>因为所有异常都是在前面处理的。字符串/字符值需要放在单引号中<代码>“YYYY-MM-DD”
是一个标识符,“yyy-MM-DD”
是一个字符constantTry,让他相信这是个坏主意。