Я разрабатываю триггер, который запускает и останавливает службы. Дело в том, что мой триггер не останавливает службу, если сначала обнаружил ошибку, которая выглядит так:
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