【发布时间】:2016-04-27 00:24:18
【问题描述】:
在第一阶段,我通过 JDBC 管理我的应用程序,因此我负责构建和验证所有 SQL。但我想知道 JPA 是否可以帮助我完成这些任务。
所以,此时我已经有了一个 DbaUser 模型,它是从 OracleDB 上的 DBA_USERS 表生成的,我实际上可以列出所有这些模型。
但是,我正在尝试创建或更新更多内容,但每当我尝试使用
em.createQuery("CREATE USER C##ANTONIO IDENTIFIED BY Antionio123").executeUpdate();
启动语法异常:The query does not start with a valid identifier, has to be either SELECT, UPDATE or DELETE FROM.
你们能给我多一点启发或指点我一些合适的教程吗?我一直在谷歌上搜索,但在 Oracle DB 系统表上没有任何具体内容。
更新 1(感谢 @JB Nizet)
将查询的执行从 JPQL 替换为 Native SQL 后,出现如下错误:
Query: DataModifyQuery(sql="CREATE USER C? IDENTIFIED BY ANTONIO123").
我已经用“...C\#\#...”替换了带有转义字符“...C##...”的主题标签,但这个问题获得了不同的味道:
Query: DataModifyQuery(sql="CREATE USER C\? IDENTIFIED BY ANTONIO123")
...我真的需要将“##”发送到 Oracle DB。如何强制使用这些特殊字符?
更新 2
所以......在谷歌搜索更多之后,我发现了位置参数,并且我还发现我们不能在 JPA 本地查询中命名参数。在此之后,我尝试过:
em.createNativeQuery("CREATE USER ?1 IDENTIFIED BY ANTONIO123").setParameter(1, "C##ANTONIO").executeUpdate();
哪些触发器:ORA-01935: missing user or role name
与
Error Code: 1935
Call: CREATE USER ? IDENTIFIED BY ANTONIO123
这告诉我这个绑定不起作用。还有其他方法吗?
提前致以诚挚的问候和感谢,
萨米
【问题讨论】:
-
你试过
em.createNativeQuery("CREATE USER C##ANTONIO IDENTIFIED BY ANTONIO123")或em.createNativeQuery("CREATE USER \"C##ANTONIO\" IDENTIFIED BY ANTONIO123")吗? -
我认为 DDL 语句不支持绑定变量(
CREATE, DROP, ALTER等)。您登录的用户是否拥有CREATE USER权限? -
尽管这是一个非常有趣的问题,您能否分享一下通过 JPA 创建 USER(尤其是普通用户)的原理......
-
嗨@MickMnemonic,是的,我当然有!我以 SYSDBA 用户的身份与 SYS 连接,这意味着我当然有权创建它们。实际上,我没有阅读任何有关 DDL 语句和变量绑定的信息,这实际上可能意味着绑定是不可能的。我认为也许 JDBC 将成为它的解决方案!感谢您的帮助!
-
嗨@MarmiteBomber! “分享理由”是什么意思? (对不起,我从没听过那个表达)。亲切的问候,大卫