Java PL/SQL 'Execute Immediate'

12 浏览
0 Comments

Java PL/SQL 'Execute Immediate'

我正在使用Java编程在Oracle数据库上开发应用程序。我使用的PL/SQL语句是:

DECLARE
USER_COUNT INTEGER;
BEGIN
  SELECT COUNT(*) INTO USER_COUNT FROM dba_users WHERE username=?;
  IF (USER_COUNT = 0) THEN
    EXECUTE IMMEDIATE 'CREATE USER ? IDENTIFIED BY ?';
    EXECUTE IMMEDIATE 'GRANT CREATE SESSION, CREATE TABLE, CREATE ANY INDEX TO ?';
  ELSE
    raise_application_error(-20101, '用户?已存在。请删除或选择其他用户名。');
  END IF;
END;
/

但是,如果问题标记周围有引号,我会遇到很多“无效的列索引”错误。例如:

    EXECUTE IMMEDIATE 'CREATE USER ? IDENTIFIED BY ?';

不起作用,但是

    EXECUTE IMMEDIATE CREATE USER ? IDENTIFIED BY ?;

可以正常工作。

然而,如果我选择使用第二种形式,我会得到另一个语法错误:

java.sql.SQLException: ORA-06550: line 6, column 23:
PLS-00103: 遇到符号“CREATE”,但期望以下之一:
 ( - + case mod new not null 
  
 continue avg count current exists max min prior sql stddev
 sum variance execute forall merge time timestamp interval
 date 
   pipe
 
 

请给予建议该怎么办。

0
0 Comments

Java PL/SQL 'Execute Immediate' 是一个常见的问题,出现的原因是在代码中没有正确使用绑定变量。在上述代码中,可以看到有两个地方使用了问号(?),但是在错误消息中忘记了将问号放入引号中。

解决方法是将问号正确地放入引号中,以便在错误消息中正确地显示问号。另外,作者提到在Oracle中,可以使用'&'代替'?'来传递绑定变量给匿名块。

下面是修改后的代码:

DECLARE
   USER_COUNT   INTEGER;
BEGIN
   SELECT COUNT (*)
     INTO USER_COUNT
     FROM dba_users
    WHERE username = '&';
  IF USER_COUNT = 0 THEN
    EXECUTE IMMEDIATE 'CREATE USER  & IDENTIFIED BY  &';
    EXECUTE IMMEDIATE 'GRANT CREATE SESSION, CREATE TABLE, CREATE ANY INDEX TO  &';
  ELSE
    raise_application_error(-20101, 'User & already exists. Please drop it or choose another username.');
  END IF;
END;
/

这样,问题就得到了解决。

0
0 Comments

在使用EXECUTE IMMEDIATE执行DDL语句时,无法使用绑定变量。这可能会导致一些问题,需要寻找解决方法。

可以参考以下链接,其中提供了更好的解释和解决方法。

Create user from string variables in a PL/SQL block

0
0 Comments

在使用Java和PL/SQL时,可能会遇到'Execute Immediate'问题。这个问题的原因是在create user语句中不能使用绑定变量?,它需要完整的文本。

另外,需要确认是否真的需要使用CREATE ANY INDEX权限。这个权限将允许新用户在整个数据库中创建索引。通常情况下,普通的CREATE INDEX权限就足够了。

为了解决这个问题,最好提前定义一个或多个角色,并将这些角色授予新用户,而不是硬编码每个可能的权限。用户是否被允许创建视图、存储过程、类型等?如果是开发人员账户,是否应该能够调试代码和定义锁定?等等...

(顺便问一句,你是将Java代码写成大写还是小写?还是Java和PL/SQL都写成大写呢?)

0