APEX - передача строки подстановки в PL/SQL

У меня возникли трудности с передачей строк подстановки в 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 ответ

Решение

Как насчет этого? Подготовьте оператор 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;
Другие вопросы по тегам