У меня возникли трудности с передачей строк замены сеанса в 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.
Так что, похоже, я неправильно экранирую нужные символы?
Тем не менее, я пробовал много разных возможных комбинаций без успеха.
'ALTER USER v('
, за которой следует словоAPP_USER
, а затем еще одна строка') IDENTIFIED BY P111_RE_PASSWORD'
, которая не имеет смысла для парсера. - person William Robertson   schedule 26.01.2018&APP_USER.
— это переменная подстановки, а:APP_USER
— это переменная связывания. В этом случае нельзя использоватьv('APP_USER')
, поскольку функцияv
будет вызываться с удаленного сервера, у которого нет доступа к локальным данным сеанса APEX. - person Jeffrey Kemp   schedule 30.01.2018