我在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块中的字符串变量创建用户