PLS-00405: подзапрос не разрешен в этом контексте - PullRequest
0 голосов
/ 10 июня 2019

Я разрабатываю триггер, который запускает и останавливает службы. Дело в том, что мой триггер не останавливает службу, если сначала обнаружил ошибку, которая выглядит так:

ORA-00604: error occurred at recursive SQL level 3
ORA-44303: service name exists
ORA-06512: at "SYS.DBMS_SERVICE_ERR", line 21
ORA-06512: at "SYS.DBMS_SERVICE", line 316

Поэтому, чтобы избежать получения ошибки, мне нужно сначала проверить, работает ли служба в сети, и только если она есть, остановить ее, но PL / SQL не принимает оператор выбора в if. Как мне быть?

CREATE OR REPLACE TRIGGER managed_service_start
    AFTER STARTUP ON DATABASE
DECLARE
    pdb_role VARCHAR2(64);
    host VARCHAR2(64);
    pdb_name VARCHAR2(64);
    rw_service VARCHAR2(64);
    ro_service VARCHAR2(64);
BEGIN
    SELECT database_role INTO pdb_role FROM v$database;
    SELECT host_name INTO host FROM v$instance;
    SELECT Upper(sys_context ('userenv', 'con_name')) INTO pdb_name FROM dual;
    SELECT rw_service into rw_service FROM dual;
    SELECT ro_service into ro_service FROM dual;
    IF pdb_role = 'PRIMARY' THEN
        DBMS_SERVICE.START_SERVICE(rw_service);
        IF (ro_service) IN (SELECT name FROM v$services) THEN
            DBMS_SERVICE.STOP_SERVICE(ro_service);
        END IF;
    ELSE
        -- IF host IN ('host_name1','host_name2') THEN
        IF host LIKE '%de%' THEN
            DBMS_SERVICE.START_SERVICE(ro_service);
            IF (rw_service) IN (SELECT name FROM v$services) THEN
                DBMS_SERVICE.STOP_SERVICE(rw_service);
            END IF;
        ELSE
            IF (ro_service) IN (SELECT name FROM v$services) THEN
                DBMS_SERVICE.STOP_SERVICE(ro_service);
            END IF;
        END IF;
    END IF;
END;
/


    LINE/COL ERROR
-------- -----------------------------------------------------------------
15/3     PL/SQL: Statement ignored
15/22    PLS-00405: subquery not allowed in this context
22/4     PL/SQL: Statement ignored
22/23    PLS-00405: subquery not allowed in this context
26/4     PL/SQL: Statement ignored
26/23    PLS-00405: subquery not allowed in this context

1 Ответ

0 голосов
/ 10 июня 2019

Непонятно, откуда вы получаете значения для rw_service и ro_service, поэтому я просто жестко запрограммировал их здесь в качестве примера.

CREATE OR REPLACE TRIGGER managed_service_start
    AFTER STARTUP ON DATABASE
DECLARE
    pdb_role VARCHAR2(64);
    host VARCHAR2(64);
    pdb_name VARCHAR2(64);
    rw_service VARCHAR2(64) := 'rw_service_name';
    ro_service VARCHAR2(64) := 'ro_service_name';
    rw_up varchar2(1);
    ro_up varchar2(1);
BEGIN
    SELECT database_role INTO pdb_role FROM v$database;
    SELECT host_name INTO host FROM v$instance;
    SELECT Upper(sys_context ('userenv', 'con_name')) INTO pdb_name FROM dual;
    -- validate that services are up. if they are down the variable will be null.
    select max('Y') into rw_up
            from v$services
            where name = rw_service;
    select max('Y') into ro_up
            from v$services
            where name = ro_service;
    IF pdb_role = 'PRIMARY' THEN
        DBMS_SERVICE.START_SERVICE(rw_service);
        IF (ro_up is not null) THEN
            DBMS_SERVICE.STOP_SERVICE(ro_service);
        END IF;
    ELSE
        -- IF host IN ('host_name1','host_name2') THEN
        IF host LIKE '%de%' THEN
            DBMS_SERVICE.START_SERVICE(ro_service);
            IF (rw_up is not null) THEN
                DBMS_SERVICE.STOP_SERVICE(rw_service);
            END IF;
        ELSE
            IF (ro_up is not null) THEN
                DBMS_SERVICE.STOP_SERVICE(ro_service);
            END IF;
        END IF;
    END IF;
END;
/

Вместо того чтобы помещать запрос в оператор IF, поместите свою логику IF в запрос и используйте результат в своем выражении IF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...