#oracle #plsql
Вопрос:
Я пытаюсь писать запросы в Oracle. Я хотел убедиться, что он работает с правильной схемой, поэтому я подумал, что приведенный ниже код решит мою проблему. Я думаю, синтаксис неправильный.
Не могли бы вы это исправить?
DECLARE v_current_schema varchar2(30); BEGIN v_current_schema := SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA'); IF V_CURRENT_SCHEMA lt;gt; 'PRODUCTION' THEN ALTER SESSION SET CURRENT_SCHEMA = "PRODUCTION" ; END IF; END;
ORA-06550: row 6, column 13:PLS-00103: Encountered symbol "ALTER", expected one of the following:( start report status go to exit if loop mod empty pragma remove back select update while with lt;determinantgt;
Комментарии:
1. В PL/SQL нет
alter
ключевого слова. Однако я не уверен, почему вы не можете просто выдатьalter session
его непосредственно в командной строке. Почему вам нужно сначала узнать текущую схему?
Ответ №1:
Две вещи
DDL
команды должны всегда выполнятьсяexecute immediate
в PL/SQL.- Вам вообще не нужна переменная, так как вы можете использовать
sys_context
ее непосредственно внутриif-then
оператора.
Упрощенный код
declare begin if sys_context('USERENV', 'CURRENT_SCHEMA') lt;gt; 'PRODUCTION' then execute immediate 'ALTER SESSION SET CURRENT_SCHEMA = PRODUCTION ' ; end if; end;
Ответ №2:
Это динамический SQL, который вы должны использовать:
declare v_current_schema varchar2(30); begin v_current_schema := sys_context('USERENV', 'CURRENT_SCHEMA'); if v_current_schema lt;gt; 'PRODUCTION' then execute immediate 'ALTER SESSION SET CURRENT_SCHEMA = PRODUCTION' ; end if ; end; /