前台调用存储过程如何返回执行的进度 可以讓走過一段out_put('dlfldslf') 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不行的。存储过程中所有的消息都是在这个过程结束后才一起出来的,不论是系统消息还是用DBMS_OUTPUT.PUT_LINE()出的消息。这就是oracle的特色啊.... 你可以设定一个过程表,当SP 中做完一个步骤,去过程表中修改一下状态,然后commit 一下,你的程序就循环select 过程表,根据状态的不同,输出给用户不通的信息 同意:withdraw(白柒拾) 另,我在项目中做的时候,采用的是表函数(oracle 9i支持)的形式,这样可不建中间表。利用表函数实时输出状态。读完表函数过程也就执行完成。 set_client_info 和 set_action 结合使用能用来看应用程序运行的情况但是在别的窗口看这窗口运行的情况declare l_owner varchar2(30) default 'SYS'; l_cnt number default 0;begin dbms_application_info.set_client_info( 'owner='||l_owner ); for x in ( select * from all_objects where owner = l_owner ) loop l_cnt := l_cnt+1; dbms_application_info.set_action( 'processing row ' || l_cnt ); end loop;end; SQL没有似乎不支持类似WINDOWS的输出流吧??可以在数据库里面存储一个变量,然后按照过程的执行情况给这个变量赋值,最后用程序取这个变量的值! xwyou(水山) 用表函数的方法应该跟好一点,回头去试试 用序号生成器试试,存储过程内掉用nextval,外面读curval yao_yuan(逍遥子) 用序号生成器试试,存储过程内掉用nextval,外面读curval-----------------Sequence在一个session中需要通过nextval才能使用curval,像你这样使用肯定无法得到确切值。 delphi_xizhousheng(西周生)在存储过程中声明一个全局变量,每个执行阶段都设置这个变量为相关的值,当执行存储过程时,用另一个线程去访问这个存储过程中的这个变量,然后读出当前执行的位置。---------------------------------------------这是个好办法,不过没做过。 ningIII(小宁)SQL没有似乎不支持类似WINDOWS的输出流吧??可以在数据库里面存储一个变量,然后按照过程的执行情况给这个变量赋值,最后用程序取这个变量的值!------------------------------个人不觉得是个好主意,首先应该在数据库里存储什么变量?其次,如果采用表的方式,那么还会涉及到一个Session Transaction的问题,储存过程中的事务如果没有提交,你是不是进度表的值也没有办法刷新,那么程序又何从谈起定位状态呢?(当然我不知道DBMS_JOB中是否可以创建一个Transaction,按原理来说觉得是不可以在一个session中存在两个事务的。) dtghh(宏)用包可以实现,包设两个变量一个总数一个当前进度数,在过程中对其付值。这两个变量即可表示进度.-------------------------------------问个问题:包的调用是怎么做的?他所涉及的变量是不是也只在调用过程中有效?我没有用过包 : bfbd(八风不动) 包变量是会话独立的=========================================是不是说其他session如果想观察另一个session的进度还是不行? 同意 qfsb_p(我心飞翔) 的说法。建议用一个统计的临时表或者叫日志表,来记录每一个步骤地执行起始时间,以及终止时间等等信息,而且最好有一个bool变量来控制,是否记录这些信息这样,打开/关闭跟踪都非常方便。就是代码会长一些 : bfbd(八风不动) 包变量是会话独立的=========================================是不是说其他session如果想观察另一个session的进度还是不行?-------------------------------------没错,每一个Session都有自己的一套包变量。 定义存储函数返回值为表类型,返回方式定义为流方式,即:一次返回表的一行,最后的运行结果什么都不返回。其实不是流方式,而是piped方式,是一次返回一行数据,Delphi可以直接把这种虚拟表当成真实表来绑定。至于在其他条件下如何使用,没做试验,感兴趣的可以用其他方法试试。 定义临时表不太可能,只所以放在一个存储过程中就是想其是一个线程(进程)处理的内容,如果在中间可以进行COMMIT就没有这么复杂了,就可在前台分别调用几个过程并进行提示了。 绝对精确的进度是不可能做到的。Oracles laws: 1 - A query is finished when a query is finished. 2 - Only slow queries need a progress report.3 - Progress reports don't exist because of law 1.因此最多也就是可能在设定的几个点上输出一些信息,知道是执行到哪儿了,但具体还需要多长时间谁也无法确定。 就是这几点输出信息如何实现,不需要具体还需多长时间。 mosaic(影子)你有好办法吗? 同意 withdraw(白柒拾)不过在里面要用事务吧,不然你COMMIT的时候连前面的操作一并commit了 这种情况在平常很多,其实大家只需要给用户一个系统正在运行的说明吧,进度就是这个作用,处理方法,用一个timer,设定进度(时间可以累加),让用户waiting吧! 我在使用oem观测表锁时发现oracle好像是通过读写的块数来实现的,这是否预示什么 可以使用utl_file包,把中间处理的进度写到一个文件中去,在外面读这个文件,不久可以知道一个大概的进度了. 字段名中包含特殊字符,应该如何处理 初学xml查询,请大侠们介绍点资料. Mysql DDL转Oracle 关于java面试的回答 继续追加100分 oracle 9i转成oracle 10g中long类型问题 访问另一个用户的表 ORACLE 9I Application Server 在PIV(2.4G)上的安装(急) oracle登陆不了? oracle 9i的客户端可以连接oracle 8.0.0.5的服务器端吗? 关于ERWin insert into tablea (a,b) values(a,b) select a,b from tableb 出错
然后commit 一下,
你的程序就循环select 过程表,根据状态的不同,输出给用户不通的信息
利用表函数实时输出状态。读完表函数过程也就执行完成。
declare
l_owner varchar2(30) default 'SYS';
l_cnt number default 0;
begin
dbms_application_info.set_client_info( 'owner='||l_owner ); for x in ( select * from all_objects where owner = l_owner )
loop
l_cnt := l_cnt+1;
dbms_application_info.set_action( 'processing row ' || l_cnt );
end loop;
end;
回头去试试
-----------------Sequence在一个session中需要通过nextval才能使用curval,像你这样使用肯定无法得到确切值。
---------------------------------------------
这是个好办法,不过没做过。
------------------------------
个人不觉得是个好主意,首先应该在数据库里存储什么变量?其次,如果采用表的方式,那么还会涉及到一个Session Transaction的问题,储存过程中的事务如果没有提交,你是不是进度表的值也没有办法刷新,那么程序又何从谈起定位状态呢?(当然我不知道DBMS_JOB中是否可以创建一个Transaction,按原理来说觉得是不可以在一个session中存在两个事务的。)
这两个变量即可表示进度.
-------------------------------------
问个问题:包的调用是怎么做的?他所涉及的变量是不是也只在调用过程中有效?我没有用过包
是不是说其他session如果想观察另一个session的进度还是不行?
建议用一个统计的临时表或者叫日志表,来记录每一个步骤地执行起始时间,以及终止时间等等信息,而且最好有一个bool变量来控制,是否记录这些信息
这样,打开/关闭跟踪都非常方便。
就是代码会长一些
包变量是会话独立的
=========================================
是不是说其他session如果想观察另一个session的进度还是不行?-------------------------------------
没错,每一个Session都有自己的一套包变量。
返回方式定义为流方式,
即:一次返回表的一行,最后的运行结果什么都不返回。其实不是流方式,而是piped方式,是一次返回一行数据,
Delphi可以直接把这种虚拟表当成真实表来绑定。
至于在其他条件下如何使用,没做试验,
感兴趣的可以用其他方法试试。
Oracles laws:
1 - A query is finished when a query is finished.
2 - Only slow queries need a progress report.
3 - Progress reports don't exist because of law 1.
因此最多也就是可能在设定的几个点上输出一些信息,知道是执行到哪儿了,但具体还需要多长时间谁也无法确定。
mosaic(影子)你有好办法吗?
不过在里面要用事务吧,不然你COMMIT的时候连前面的操作一并commit了