Sql oracle数据库如何组合这两个语句

Sql oracle数据库如何组合这两个语句,sql,oracle,Sql,Oracle,我想结合以下两种说法: select password from sys.user$ where name='SYSMAN'; alter user SYSMAN identified by values '7A0F2B316C212D32'; 当然,“7A0F2B316C212D32”是从第一条语句获得的结果。一般来说,给定一个类似“SYSMAN”的字符串,如何一笔完成两条语句 非常感谢 不幸的是,Oracle不允许这样做: ALTER USER SYSMAN IDENTIFIED BY V

我想结合以下两种说法:

select password from sys.user$ where name='SYSMAN';
alter user SYSMAN identified by values '7A0F2B316C212D32';
当然,“7A0F2B316C212D32”是从第一条语句获得的结果。一般来说,给定一个类似“SYSMAN”的字符串,如何一笔完成两条语句


非常感谢

不幸的是,Oracle不允许这样做:

ALTER USER SYSMAN IDENTIFIED BY VALUES (SELECT password FROM sys.user$ WHERE name='SYSMAN')
所以您唯一的选择似乎是PL/SQL。您可能可以将其放在一个过程中,然后调用它(我假设使用源和目标用户的参数)

以下是如何在存储过程中执行此操作:

CREATE OR REPLACE PROCEDURE move_password (
 source_user IN varchar2,
 dest_user IN varchar2
)
IS
  pass varchar(30);
BEGIN
  select password into pass from sys.user$ where name=source_user;
  execute immediate 'alter user '||dest_user||' identified by values ''' || pass || '''';
END;
不过,当我测试它时,像这样在用户之间移动密码实际上是行不通的。至少在10g。我还没考过11分。显然,在10g中,密码散列包含用户名(11不同,可能有效)。有一些


当然,因为这包括动态SQL,所以您必须小心上面没有处理的引用。假定只允许sysdba调用此过程,因此…

不幸的是,Oracle不允许这样做:

ALTER USER SYSMAN IDENTIFIED BY VALUES (SELECT password FROM sys.user$ WHERE name='SYSMAN')
所以您唯一的选择似乎是PL/SQL。您可能可以将其放在一个过程中,然后调用它(我假设使用源和目标用户的参数)

以下是如何在存储过程中执行此操作:

CREATE OR REPLACE PROCEDURE move_password (
 source_user IN varchar2,
 dest_user IN varchar2
)
IS
  pass varchar(30);
BEGIN
  select password into pass from sys.user$ where name=source_user;
  execute immediate 'alter user '||dest_user||' identified by values ''' || pass || '''';
END;
不过,当我测试它时,像这样在用户之间移动密码实际上是行不通的。至少在10g。我还没考过11分。显然,在10g中,密码散列包含用户名(11不同,可能有效)。有一些


当然,因为这包括动态SQL,所以您必须小心上面没有处理的引用。假设只允许sysdba调用此过程,因此…

另一个选项是SQL生成SQL

像这样的东西应该会让你产生这样的想法:

select 'alter user '||name||' identified by values '||chr(39)||password||chr(39)||';' from sys.user$ where name = 'SYSMAN';
将生成所需的alter user语句:

alter user SYSMAN identified by values '7A0F2B316C212D32';
根据您想要得到的效果,如果您需要生成大量类似的语句,您可以将输出假脱机到文件,然后让您的脚本调用生成的脚本,等等。有很多选项


希望有帮助。

另一个选项是SQL生成SQL

像这样的东西应该会让你产生这样的想法:

select 'alter user '||name||' identified by values '||chr(39)||password||chr(39)||';' from sys.user$ where name = 'SYSMAN';
将生成所需的alter user语句:

alter user SYSMAN identified by values '7A0F2B316C212D32';
根据您想要得到的效果,如果您需要生成大量类似的语句,您可以将输出假脱机到文件,然后让您的脚本调用生成的脚本,等等。有很多选项


希望这能有所帮助。

谢谢您提供的信息。你介意提供PL/SQL过程吗?@QiangLi:我已经用存储过程更新了我的答案,谢谢你提供的信息。你介意提供PL/SQL过程吗?@QiangLi:我已经用存储过程更新了我的答案,太好了。但是,除了写入文件然后执行之外,还有没有一种直接执行生成的sql的方法呢?@QiangLi:您可以使用内联PL/sql,方法是将它包装在
开始
/
结束
块中,并使用
立即执行
。但当然,这或多或少是我做的…哦,太好了。但是,除了写入文件然后执行之外,还有没有一种直接执行生成的sql的方法呢?@QiangLi:您可以使用内联PL/sql,方法是将它包装在
开始
/
结束
块中,并使用
立即执行
。但当然,这或多或少是我所做的。。。