Oracle DBMS_应用程序_信息似乎在过程中工作,而不是在作业中
下面的示例代码说明了我在dbms_应用程序_信息方面遇到的一个问题。如果我在以下过程中使用它:Oracle DBMS_应用程序_信息似乎在过程中工作,而不是在作业中,oracle,plsql,Oracle,Plsql,下面的示例代码说明了我在dbms_应用程序_信息方面遇到的一个问题。如果我在以下过程中使用它: create or replace procedure test01 is vsql varchar2(50); begin vsql := 'select sysdate from dual'; execute immediate vsql; DBMS_APPLICATION_INFO.SET_MODULE('TEST','Starting...'); dbms_lock.sleep ( 10 );
create or replace procedure test01 is
vsql varchar2(50);
begin
vsql := 'select sysdate from dual';
execute immediate vsql;
DBMS_APPLICATION_INFO.SET_MODULE('TEST','Starting...');
dbms_lock.sleep ( 10 );
DBMS_APPLICATION_INFO.SET_MODULE(NULL, NULL);
end;
/
exec test01;
然后查询v$会话显示正在启动。。。我希望如此
但是,必须在作业中运行相关过程。如果我这样做,那么我就看不到开始
declare
JNAME varchar2(200) := to_char(sysdate, 'YYYYMMDDHHMiSS');
BEGIN
DBMS_SCHEDULER.create_job (
job_name => 'TEST01_'||JNAME,
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN TEST.TEST01; END;',
start_date => NULL,
repeat_interval => NULL,
enabled => TRUE);
END;
/
这段代码应该是可执行的任何人谁可能希望有一个看,也许可以帮助我理解为什么会这样
谢谢!->利物浦 必须在execute immediate语句中使用INTO子句
create or replace procedure test01 is
vsql varchar2(50);
l_date DATE;
begin
vsql := 'select sysdate from dual';
execute immediate vsql into l_date; --<<<< here
DBMS_APPLICATION_INFO.SET_MODULE('TEST','Starting...');
dbms_lock.sleep ( 20 );
DBMS_APPLICATION_INFO.SET_MODULE(NULL, NULL);
end;
/
使用INTO子句可以设置模块和操作
就好像你把这个从句写进从句一样,没有例外,但是
若dynamic_sql_语句是SELECT语句,并且您省略了into_子句和bulk_COLLET_into_子句,那个么execute_immediate_语句永远不会执行
所以我希望应用程序信息应该在没有INTO子句的情况下设置,但出于某种原因,它不是。不管怎么说,使用到它的作品很好
我在12.1上进行了测试,在设置任何应用程序信息之前,此过程将引发异常。但它不会。。。我在运行它。SQL>exectest01;PL/SQL过程已成功完成。SQL>您确定作业正在运行吗?选中“从所有作业中选择作业名称、状态”;是 啊状态更改为“运行”…@Scouse_Bob可能太晚了,无法提出此建议,但如果不立即执行,您可能会得到更集中的答案。很多人都会认为它会失败,尽管它实际上并没有失败。嗨,感谢这一点-对我来说,问题是该过程运行良好,或者作为作业运行,或者仅从exec test01运行;但是,如果将其作为作业运行,则在v$session中不会获得引用它按照dbms\u application\u info中的设置运行的条目。它以一种方式工作,但不能以另一种方式工作。这是我的问题…:-/关键是,你想要实现什么。如果你想有一个有意义的完整程序-添加INTO子句,一切都会按预期进行。如果你想理解,为什么你会通过输入INTO子句观察到奇怪的行为,最好的解释可能是@StevenFeuerstein