执行立即更改用户绑定变量

Ati*_*tif 1 oracle

以下程序:

create or replace
PROCEDURE ChangePassword
(
    p_Name      VARCHAR2,
    p_Password  VARCHAR2
)
AS
  EXECUTE IMMEDIATE 'ALTER USER :a IDENTIFIED BY :b' USING p_Name, p_Password;
END;
Run Code Online (Sandbox Code Playgroud)

成功编译,但执行时:

exec ChangePassword('TestUser', 'newPassword');
Run Code Online (Sandbox Code Playgroud)

导致错误:

01935. 00000 -  "missing user or role name"
*Cause:    A user or role name was expected.
*Action:   Specify a user or role name.
Run Code Online (Sandbox Code Playgroud)

为什么?

Dav*_*sta 5

您不能使用绑定变量代替标识符,例如此语句中的用户名.解析语句时需要知道标识符的值,而在执行之前解析之后合并绑定值.