Java PL/SQL 'Execute Immediate'



我在Oracle数据库上编写Java应用程序。我使用的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, 'User ? already exists. Please drop it or choose another username.');
  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: Encountered the symbol "CREATE" when expecting one of the following:
 ( - + case mod new not null <an identifier>
 <a double-quoted delimited-identifier> <a bind variable>
 continue avg count current exists max min prior sql stddev
 sum variance execute forall merge time timestamp interval
 date <a string literal with character set specification>
 <a number> <a single-quoted SQL string> pipe
 <an alternatively-quoted string literal with character set specification>
 <an alternat

如果?是绑定变量,则不能在create user语句中使用这些变量。它需要完整的文本。

你真的是指CREATE ANY INDEX吗?这将允许新用户索引整个数据库中的任何表。正常情况下,简单的CREATE INDEX就足够了。

最好提前定义一个或多个角色,然后将这些角色授予新用户,而不是硬编码所有可能的权限。是否应该允许用户创建视图、过程、类型等?如果它是一个开发人员帐户,它应该能够调试代码和定义锁吗?等等…

(只是出于兴趣,你写Java是大写的,还是只写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, 'User ? already exists. Please drop it or choose another username.');
  END IF;
END;
/

在EXECUTE IMMEDIATE中使用DDL时不能使用绑定变量。

你可以参考下面的链接@,有更好的解释

从PL/SQL块中的字符串变量创建用户

最新更新