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

标签 oracle go

Oracle 版本:Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

查询: 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

我的查询有什么问题吗?或者它看起来像是我用来做同样事情的第 3 方驱动程序的问题?

最佳答案

去掉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

关于oracle - 使用内联约束更改表时出现 ORA-01735,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57037549/

相关文章:

sql - 最近 24 小时使用 Oracle SQL 从表中更新记录?

oracle - 在 Oracle 过程中的字符串中调用函数

Go:为新旧变量分配多个返回值函数

go - 如何在 Go 中追踪函数返回不匹配?

r - 连接到 Oracle 数据库时如何通过 dbplyr 使用 EXTRACT

SQL - 按 ID 分组和从变量起点开始的时间间隔

java - 从多个并行线程中的表中删除时的 JPA 死锁

go - ZeroMQ 知道请求来自哪个 go routine

go - 将四字符日期字符串转换为日期字符串

go - 这构建得很好。为什么这段代码不执行?