Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Alter table,add column/ORA-00984:此处不允许列PLSQL_Sql_Oracle_Plsql_Oracle11g_Alter - Fatal编程技术网

Alter table,add column/ORA-00984:此处不允许列PLSQL

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

下一条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 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,让他相信这是个坏主意。