APEX - 在 PL/SQL 中传递替换字符串
APEX - passing substitution string in PL/SQL
我在 APEX 5 中传递会话替换字符串时遇到一些困难。
我的 APEX 应用程序中有一个进程将更改远程数据库上用户的密码。用户名是根据本地 LDAP 身份验证设置的,因此保存在 APEX 替换字符串中:APP_USER
我想将此字符串传递到远程数据库,以便我可以更改当前登录用户的密码(希望这是有意义的!)
我有这个过程,当在 APEX 页面上按下 "change password" 按钮时执行:
DECLARE
cursor_handle INTEGER;
cursor_handle_tmp INTEGER;
BEGIN
-- Open a Cursor on the REMOTE database
cursor_handle := DBMS_SQL.OPEN_CURSOR@remote_db;
-- Parse the "change password"
DBMS_SQL.PARSE@remote_db(cursor_handle,'ALTER USER MYUSER IDENTIFIED BY mypassword',DBMS_SQL.NATIVE);
-- Execute the cursor
cursor_handle_tmp := DBMS_SQL.EXECUTE@remote_db(cursor_handle);
-- Close the cursor
DBMS_SQL.CLOSE_CURSOR@remote_db(cursor_handle);
END;
这执行得很好,因为用户和密码都是硬编码的概念证明,并且远程用户的密码已按预期更改。
但是,如果我随后使用替换字符串:APP_USER 和:P111_PASSWORD,我会收到错误消息:
missing user or role name
这意味着字符串没有正确传递到远程数据库。
如果我使用 v 函数 V('APP_USER'),我的代码将无法在编辑器中正确验证,因为 APEX 将其标记为以下错误:
DBMS_SQL.PARSE@passman_bandev(cursor_handle,'ALTER USER v('APP_USER') IDENTIFIED BY P111_RE_PASSWORD',DBMS_SQL.NATIVE);
ORA-06550: line 11, column 63: PLS-00103: Encountered the symbol "APP_USER" when expecting one of the following: ) , * & = - + < / > at in is mod remainder not rem => <an exponent (**)> <> or != or ~= >= <= <> and or like like2 like4 likec between || multiset member submultiset The symbol ", was inserted before "APP_USER" to continue.
看来我可能没有正确转义必要的字符?
但是,我尝试了许多不同的可能组合,但都没有成功。
这个怎么样?在局部变量中准备 ALTER USER 语句,然后在 DBMS_SQL.PARSE.
中使用它
declare
l_str varchar2(100);
l_my_password varchar2(30) := 'pwd';
begin
l_str := 'alter user ' || :APP_USER || ' identified by ' || l_my_password;
DBMS_SQL.PARSE@remote_db(cursor_handle, l_str, DBMS_SQL.NATIVE);
...
end;
我在 APEX 5 中传递会话替换字符串时遇到一些困难。
我的 APEX 应用程序中有一个进程将更改远程数据库上用户的密码。用户名是根据本地 LDAP 身份验证设置的,因此保存在 APEX 替换字符串中:APP_USER
我想将此字符串传递到远程数据库,以便我可以更改当前登录用户的密码(希望这是有意义的!)
我有这个过程,当在 APEX 页面上按下 "change password" 按钮时执行:
DECLARE
cursor_handle INTEGER;
cursor_handle_tmp INTEGER;
BEGIN
-- Open a Cursor on the REMOTE database
cursor_handle := DBMS_SQL.OPEN_CURSOR@remote_db;
-- Parse the "change password"
DBMS_SQL.PARSE@remote_db(cursor_handle,'ALTER USER MYUSER IDENTIFIED BY mypassword',DBMS_SQL.NATIVE);
-- Execute the cursor
cursor_handle_tmp := DBMS_SQL.EXECUTE@remote_db(cursor_handle);
-- Close the cursor
DBMS_SQL.CLOSE_CURSOR@remote_db(cursor_handle);
END;
这执行得很好,因为用户和密码都是硬编码的概念证明,并且远程用户的密码已按预期更改。
但是,如果我随后使用替换字符串:APP_USER 和:P111_PASSWORD,我会收到错误消息:
missing user or role name
这意味着字符串没有正确传递到远程数据库。
如果我使用 v 函数 V('APP_USER'),我的代码将无法在编辑器中正确验证,因为 APEX 将其标记为以下错误:
DBMS_SQL.PARSE@passman_bandev(cursor_handle,'ALTER USER v('APP_USER') IDENTIFIED BY P111_RE_PASSWORD',DBMS_SQL.NATIVE);
ORA-06550: line 11, column 63: PLS-00103: Encountered the symbol "APP_USER" when expecting one of the following: ) , * & = - + < / > at in is mod remainder not rem => <an exponent (**)> <> or != or ~= >= <= <> and or like like2 like4 likec between || multiset member submultiset The symbol ", was inserted before "APP_USER" to continue.
看来我可能没有正确转义必要的字符?
但是,我尝试了许多不同的可能组合,但都没有成功。
这个怎么样?在局部变量中准备 ALTER USER 语句,然后在 DBMS_SQL.PARSE.
中使用它declare
l_str varchar2(100);
l_my_password varchar2(30) := 'pwd';
begin
l_str := 'alter user ' || :APP_USER || ' identified by ' || l_my_password;
DBMS_SQL.PARSE@remote_db(cursor_handle, l_str, DBMS_SQL.NATIVE);
...
end;