【问题标题】:Executing PL/SQL Begin/End procedure from Oracle JDBC thin driver从 Oracle JDBC 瘦驱动程序执行 PL/SQL Begin/End 过程
【发布时间】:2011-10-07 17:21:59
【问题描述】:

我正在尝试创建 Oracle PL/SQL 过程并通过 Oracle JDBC(瘦驱动程序)执行它们。这是完整的 PL/SQL 脚本:

begin
for i in (select owner, constraint_name, table_name from all_constraints where owner = 'SCHEMA' and status = 'ENABLED') LOOP
execute immediate 'alter table SCHEMA.'||i.table_name||' disable constraint SCHEMA.'||i.constraint_name||'';
end loop;
end;
/
begin
for i in (select table_name from all_tables where owner = 'SCHEMA') LOOP
execute immediate 'truncate table SCHEMA.'||i.table_name||'';
end loop;
end;
/
begin
for i in (select owner, constraint_name, table_name from all_constraints where owner = 'SCHEMA' and status = 'DISABLED') LOOP
execute immediate 'alter table SCHEMA.'||i.table_name||' enable constraint SCHEMA.'||i.constraint_name||'';
end loop;
end;
/

在 java 中,我在 '/' 上进行拆分,因此每个 begin end 块都在单独的语句中执行。执行语句的java代码是:

CallableStatement c = dbc.getConnection().prepareCall(sqlStatement);
c.executeUpdate();

我收到以下错误:

java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended
ORA-06512: at line 3

如何格式化并在 JDBC 中执行 PL/SQL?

更新:为了澄清,所有三个语句都在没有分隔的“/”分隔符的情况下执行。

更新:oracle服务器为以下版本:Oracle Database 11g Release 11.2.0.1.0 - 64bit Production

【问题讨论】:

  • 我没有看到发布的代码有任何问题。只需确保您的 SQL 语句以分号结尾。所以分号是必须的,斜线不能出现。
  • 查看 Codo 的评论:“斜线不能出现”是关键短语。
  • 我已更新问题以表明在 CallableStatement 上执行更新时“/”确实不存在。
  • @Codo Sql 语句不应以分号结尾。这是动态 sql 字符串中的常见错误。 SQL 语句不需要终止符,可能您对 SQL*PLus SQL TERMINATOR 环境变量感到困惑!
  • @zep:这是一个 PL/SQL BEGIN/END 块。它可能在没有分号的情况下工作(我没有尝试过),但它肯定可以使用它。我同意对于 DML 语句,这将是一个错误。

标签: oracle jdbc plsql ora-00933


【解决方案1】:

在“启用/禁用”约束中,您不应添加架构名称 (your'SCHEMA)。

从手册: ALTER TABLE

你的例子:

begin
    for i in (select owner, constraint_name, table_name
              from   all_constraints
              where  owner = 'SCHEMA'
              and    status = 'ENABLED')
    loop
        execute immediate 'alter table SCHEMA.' || i.table_name ||
                          ' disable constraint ' || i.constraint_name;
    end loop;
end;

测试查询

select ac.constraint_name, ac.table_name, ac.status, ac.owner
from   all_constraints ac
where  ac.owner = 'HR'
and    ac.constraint_name = 'EMP_SALARY_MIN'

结果

CONSTRAINT_NAME                TABLE_NAME                     STATUS   OWNER
------------------------------ ------------------------------ -------- --------------------------------------------------------------------------------
EMP_SALARY_MIN                 EMPLOYEES                      ENABLED  HR

正确的动态sql

begin
    execute immediate 'alter table HR.EMPLOYEES disable constraint EMP_SALARY_MIN';
end;

上一个查询结果

CONSTRAINT_NAME                TABLE_NAME                     STATUS   OWNER
------------------------------ ------------------------------ -------- --------------------------------------------------------------------------------
EMP_SALARY_MIN                 EMPLOYEES                      DISABLED HR

【讨论】:

  • 在阅读了 oracle 约束后,我意识到这是一个问题。根据 zep 的回答更正 SQL 后,我仍然收到错误消息。原来我当前的用户需要“创建任何索引”和“删除任何索引”权限才能成功禁用/启用外键和主键。授予 zep 的答案。
猜你喜欢
  • 2019-05-17
  • 2010-11-07
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
相关资源
最近更新 更多