APEX - 在PL / SQL中传递替换字符串

时间:2018-01-26 10:08:01

标签: oracle plsql oracle-apex-5 oracle-apex-5.1 string-substitution

我在APEX 5中传递会话替换字符串时遇到了一些困难。

我的APEX应用程序中有一个进程,它将更改远程数据库上用户的密码。用户名是从本地LDAP身份验证设置的,因此保存在APEX替换字符串中:APP_USER

我想将此字符串传递给远程数据库,以便我可以更改当前登录用户的密码(希望有意义!

我有这个过程,当"更改密码"在APEX页面上按下按钮:

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.

所以看起来我可能没有正确地逃避必要的角色?

但是,我尝试了许多不同的组合而没有成功。

1 个答案:

答案 0 :(得分:2)

这个怎么样?在局部变量中准备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;