执行立即句子的参数(在程序内)

时间:2013-05-24 14:30:56

标签: oracle oracle11g createuser execute-immediate

我很想在程序中的User表中创建一个ORACLE USER。问题是我不知道如何调用特定的列。我尝试过使用Camp.user.username和那些东西。

create or replace 
PROCEDURE PR_USERPASS AS
 BEGIN
  UPDATE CAMP.USERS
  SET USERNAME = (DBMS_RANDOM.string('x',15)), PASS = DBMS_RANDOM.string('x',12);
  EXECUTE IMMEDIATE 'CREATE USER ' || USERNAME || ' IDENTIFIED BY ' || PASSWORD;
  EXECUTE IMMEDIATE 'Grant connect to ' || USERNAME;
 END PR_USERPASS;

无论如何都要在同一程序中调用这些引用? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

使用cursor遍历Camp.Users表并访问其列。你的代码会像这样(未经测试):

create or replace 
PROCEDURE PR_USERPASS AS
BEGIN
  UPDATE CAMP.USERS
  SET USERNAME = (DBMS_RANDOM.string('u',15)), PASS = DBMS_RANDOM.string('x',12);
  FOR userRow IN (SELECT Username, Pass FROM Camp.Users) LOOP
     EXECUTE IMMEDIATE 'CREATE USER ' || userRow.Username || ' IDENTIFIED BY ' || userRow.Pass;
     EXECUTE IMMEDIATE 'GRANT CONNECT TO ' || userRow.Username;
  END LOOP;
END PR_USERPASS;

附录:原始答案生成USERNAMEDBMS_Random.String('x', 15),其中包含用户名和密码的数字和数字。当用户名以数字开头时,这会造成麻烦。答案已更改为使用DBMS_Random.String('u', 15)仅生成Oracle可接受的用户名值。密码似乎没有前导数字。

如果需要以数字开头的用户名,只需用双引号括起用户名:

     EXECUTE IMMEDIATE 'CREATE USER "' || userRow.Username || '" IDENTIFIED BY ' || userRow.Pass;
     EXECUTE IMMEDIATE 'GRANT CONNECT TO "' || userRow.Username || '"';

那就是说,我不确定是否有非标准的用户名是个好主意。

可以找到DBMS_Random.String的文档here