ORA-01735使用内联约束更改表时

时间:2019-07-15 10:08:42

标签: oracle go

Oracle版本: Oracle Database 12c企业版12.2.0.1.0版-64位生产版本

查询:    ALTER TABLE "TAB" ADD "XVAR" CLOB CHECK ("XVAR" IS JSON);

我不太明白这句话有什么问题。有人可以指出这是什么问题吗?

据我了解,默认情况下不需要命名约束。甚至命名约束也无济于事。

我正在尝试通过go-oci8 driver在数据库上运行查询。

执行相同操作的代码是:

package main

import (
"database/sql"
"fmt"
_ "github.com/mattn/go-oci8"
)

func main() {
db, err := sql.Open("oci8", "<connectionString>")
if err != nil {
    fmt.Println(err)
    return
}
defer func(db *sql.DB) {
    if err := db.Close(); err != nil{
        fmt.Println(err)
    }
}(db)

_sql := `ALTER TABLE "TAB" ADD "XVAR" CLOB CHECK ("XVAR" IS JSON);`

result, err := db.Exec(_sql)
if err != nil {
    fmt.Println("Issue with altering table...")
    fmt.Println(err)
    return
}

fmt.Println(result.RowsAffected())

}

输出:

Issue with altering table...
ORA-01735: invalid ALTER TABLE option

我的查询有问题吗?还是我用来执行相同操作的第三方驱动程序似乎有问题?

1 个答案:

答案 0 :(得分:2)

ALTER语句的末尾删除分号:

_sql := `ALTER TABLE "TAB" ADD "XVAR" CLOB CHECK ("XVAR" IS JSON)`

分号是客户端语句分隔符,不是实际语句的一部分(对于SQL; PL / SQL是另一回事)。

通过动态SQL(而不是堆栈)演示问题并解决,但是问题和解决方案相同:

BEGIN
  EXECUTE IMMEDIATE 'ALTER TABLE "TAB" ADD "XVAR" CLOB CHECK ("XVAR" IS JSON);';
END;
/

ORA-01735: invalid ALTER TABLE option
ORA-06512: at line 2

BEGIN
  EXECUTE IMMEDIATE 'ALTER TABLE "TAB" ADD "XVAR" CLOB CHECK ("XVAR" IS JSON)';
END;
/

Table altered.

db<>fiddle