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.

Так что, похоже, я неправильно экранирую нужные символы?

Тем не менее, я пробовал много разных возможных комбинаций без успеха.


person Huskie69    schedule 26.01.2018    source источник
comment
Используйте переменные связывания: java2s.com/Code/Oracle/System-Packages/   -  person Rene    schedule 26.01.2018
comment
Вы имели в виду заключать в кавычки или вставлять переменную связывания, или объединять выходные данные локальной функции, или вызвать функцию на удаленном сайте? В настоящее время у вас есть одна строка 'ALTER USER v(', за которой следует слово APP_USER, а затем еще одна строка ') IDENTIFIED BY P111_RE_PASSWORD', которая не имеет смысла для парсера.   -  person William Robertson    schedule 26.01.2018
comment
Обратите внимание, что &APP_USER. — это переменная подстановки, а :APP_USER — это переменная связывания. В этом случае нельзя использовать v('APP_USER'), поскольку функция v будет вызываться с удаленного сервера, у которого нет доступа к локальным данным сеанса APEX.   -  person Jeffrey Kemp    schedule 30.01.2018


Ответы (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;
person Littlefoot    schedule 26.01.2018
comment
Примечание. Я бы заключил пароль в двойные кавычки на случай, если кто-то поставит пробелы в свой пароль, например. ...' identified by "' || l_my_password || '"'; - person Jeffrey Kemp; 30.01.2018