【问题标题】:I can't set parameters in java using Oracle Sql query我无法使用 Oracle Sql 查询在 java 中设置参数
【发布时间】:2021-05-30 08:18:41
【问题描述】:

我有一个数据库 Oracle 12 并查询“ALTER USER GISDPFB SET DEFAULT TABLESPACE DEV_MDS” 查询是正确的,我可以手动执行,但我不能动态设置参数。 我的代码:

 callableStatement = connection.prepareCall("ALTER USER ? DEFAULT TABLESPACE ?");
    callableStatement.setString(1,"John");
    callableStatement.setString(2,"SYSAUX");
    callableStatement.execute();

我收到“java.sql.SQLSyntaxErrorException: ORA-01935: 缺少用户或角色名称”

我猜这个异常是因为语法错误,但我在控制台中成功了

【问题讨论】:

    标签: java sql database oracle


    【解决方案1】:

    您只能将绑定变量用于值,而不是标识符 - 用户名和表空间名称都是。您需要将它们嵌入到语句中:

    callableStatement = connection.prepareCall("ALTER USER \"John\" DEFAULT TABLESPACE \"SYSAUX\"");
    callableStatement.execute();
    

    或者如果值来自 Java 变量:

    callableStatement = connection.prepareCall("ALTER USER \"" + userName
      + "\" DEFAULT TABLESPACE \"" + tablespaceName + "\"");
    callableStatement.execute();
    

    如果它们来自变量,您可能需要考虑添加 dbms_assert 检查。

    【讨论】:

      【解决方案2】:

      我很确定 ALTER USER 被认为是 DLL 并且不使用绑定变量。您可能只需要为它创建一个字符串。试试:

      callableStatement = connection.prepareCall("ALTER USER john DEFAULT TABLESPACE SYSAUX");
      callableStatement.execute();
      

      【讨论】:

      • 你能给我建议吗,对于我的 Oracle 案例,你会使用什么样的查询?我需要使用绑定变量(?,?)
      • 您可以通过将ALTER USER 包裹在EXECUTE IMMEDIATE 中来查看这个答案。我还没有验证它是否有效。 stackoverflow.com/questions/10315170/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多