Oracle PL-SQL:在过程内执行触发器
我想在一个过程中执行触发器。是否有任何方法可以在过程中使用顶点执行PL/SQL?我尝试使用此代码接收以下错误Oracle PL-SQL:在过程内执行触发器,oracle,plsql,triggers,Oracle,Plsql,Triggers,我想在一个过程中执行触发器。是否有任何方法可以在过程中使用顶点执行PL/SQL?我尝试使用此代码接收以下错误 LINE/COL ERROR -------- ----------------------------------------------------------------- 6/22 PLS-00103: Encountered the symbol " CREATE OR REPLACE TRIGGER managed_service_start
LINE/COL ERROR
-------- -----------------------------------------------------------------
6/22 PLS-00103: Encountered the symbol "
CREATE OR REPLACE TRIGGER managed_service_start
AFTER STARTUP ON DATABASE
DECLARE
pdb_role VARCHAR2(64);
pdb_name " when expecting one of the following:
( - + case mod new not null <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
continue avg count current exists max min prior sql stddev
sum variance execute forall merge time timestamp interval
date <a string literal with character set specification>
LINE/COL ERROR
-------- -----------------------------------------------------------------
<a number> <a s
我该怎么办?我的目标是只运行这个过程一次,避免在每个pdb中执行触发器
CREATE OR REPLACE PROCEDURE start_services AS
BEGIN
FOR i IN (SELECT name FROM v$pdbs p WHERE p.name <> 'PDB$SEED')
LOOP
EXECUTE IMMEDIATE 'ALTER SESSION SET CONTAINER= ' || i.name;
EXECUTE IMMEDIATE '
CREATE OR REPLACE TRIGGER managed_service_start
AFTER STARTUP ON DATABASE
DECLARE
pdb_role VARCHAR2(64);
pdb_name VARCHAR2(64);
host VARCHAR2(64);
BEGIN
SELECT database_role INTO pdb_role FROM v$database;
SELECT Upper(sys_context ("userenv", "con_name")) INTO pdb_name FROM dual;
SELECT host_name INTO host FROM v$instance;
IF pdb_role = "PRIMARY" THEN
DBMS_SERVICE.START_SERVICE(pdb_name || "_RW");
ELSE
-- IF host IN ("host_name1","host_name2") THEN
IF host LIKE "%de%" THEN
DBMS_SERVICE.START_SERVICE(pdb_name || "_RO");
END IF;
END IF;
END;
/
';
END LOOP;
END;
/
在文本中,似乎在所有文本周围加上了双引号。它们必须是单引号 由于这些单引号位于文字字符串中,因此需要在一行中放置两个单引号
begin
execute immediate '
CREATE OR REPLACE TRIGGER managed_service_start
AFTER STARTUP ON DATABASE
DECLARE
pdb_role VARCHAR2(64);
pdb_name VARCHAR2(64);
host VARCHAR2(64);
BEGIN
SELECT database_role INTO pdb_role FROM v$database;
SELECT Upper(sys_context (''userenv'', ''con_name'')) INTO pdb_name FROM dual;
SELECT host_name INTO host FROM v$instance;
IF pdb_role = ''PRIMARY'' THEN
DBMS_SERVICE.START_SERVICE(pdb_name || ''_RW'');
ELSE
-- IF host IN (''host_name1'',''host_name2'') THEN
IF host LIKE ''%de%'' THEN
DBMS_SERVICE.START_SERVICE(pdb_name || ''_RO'');
END IF;
END IF;
END;
/';
end;
/
致以最良好的祝愿,
Stew Ashton简单地说,用单引号替换所有双引号,并用带引号的字符串q包装触发器的DDL,如下所示:
CREATE OR REPLACE PROCEDURE start_services AS
BEGIN
FOR i IN (SELECT name FROM v$pdbs p WHERE p.name <> 'PDB$SEED')
LOOP
EXECUTE IMMEDIATE 'ALTER SESSION SET CONTAINER= ' || i.name;
EXECUTE IMMEDIATE q'#
CREATE OR REPLACE TRIGGER managed_service_start
AFTER STARTUP ON DATABASE
DECLARE
pdb_role VARCHAR2(64);
pdb_name VARCHAR2(64);
host VARCHAR2(64);
BEGIN
SELECT database_role INTO pdb_role FROM v$database;
SELECT Upper(sys_context ('userenv', 'con_name')) INTO pdb_name FROM dual;
SELECT host_name INTO host FROM v$instance;
IF pdb_role = 'PRIMARY' THEN
DBMS_SERVICE.START_SERVICE(pdb_name || '_RW');
ELSE
-- IF host IN ('host_name1','host_name2') THEN
IF host LIKE '%de%' THEN
DBMS_SERVICE.START_SERVICE(pdb_name || '_RO');
END IF;
END IF;
END;
#';
END LOOP;
END;
/
干杯 动态创建数据库触发器的原因是什么?我没有看到任何变量,所以创建触发器就行了。如果您尝试这样做,您还应该看到语法错误。双引号必须替换为单引号'。在字符串中,只需将其加倍,即如果pdb_role=PRIMARY,则原因是此数据库体系结构在容器中有一个容器和多个可插入数据库pdb。如果我可以这样做,我可以避免为每个pdb创建N次触发器,并在每次插入/拔出后重新创建。我尝试替换为,但仍然存在相同的错误。使用此选项时,它会编译,但执行时会出现错误:ORA-44303:服务名称存在您需要在字符串结束前删除“/”。我已经编辑了答案。请查收。