我想使用Oracle SQL Developer异步执行存储过程很多次。
伪代码
var pStatus number
var pOraErrCd varchar2
var pOraErrMsg varchar2
for i 1 .. 1000 -- do async
loop
exec myproc('test',:pStatus ,:pOraErrCd ,:pOraErrMsg);
end loop;
存储过程的目的是进行一些插入。为了进行测试,我只想异步执行存储过程很多次。我不在乎任何返回值。
有没有一种 “简便”的 方法来做到这一点?
由于您要模拟N个会话,每个会话均调用该过程1000 / N次,因此我可能会执行类似的操作
CREATE OR REPLACE PROCEDURE call_myproc_n_times( p_n IN NUMBER )
AS
p_status NUMBER;
p_ora_error_code VARCHAR2(1000);
p_ora_error_msg VARCHAR2(1000);
BEGIN
FOR i IN 1 .. p_n
LOOP
myproc( 'test',
p_status,
p_ora_error_code,
p_ora_error_msg );
END LOOP;
END;
DECLARE
l_num_sessions number := 10;
l_exec_per_session number := 100;
l_jobno pls_integer;
BEGIN
FOR i IN 1 .. l_num_sessions
LOOP
dbms_job.submit(
l_jobno,
'BEGIN ' ||
' call_myproc_n_times( ' || l_exec_per_session || ' ); ' ||
'END;',
sysdate + interval '1' minute );
END LOOP;
commit;
END;
本示例将启动10个会话,每个会话将快速连续执行该过程100次,前提是您的数据库JOB_QUEUE_PROCESSES
至少为10,这意味着允许Oracle在后台同时运行10个作业。创建CALL_MYPROC_N_TIMES
过程并不是严格必要的,它只是使构建字符串更容易在工作中执行。
一种替代方法是提交1000个作业,每个作业仅被调用MYPROC
一次,并依靠该JOB_QUEUE_PROCESSES
参数来限制将同时运行的作业数量。那会行得通,如果您想运行更少的并发会话,那么更改数据库参数就更加困难-L_NUM_SESSIONS
在我发布的代码中进行调整很容易。
问题内容: 简而言之:我正在尝试在Entity Framework中运行Oracle存储过程(我知道这听起来很奇怪,但是在一般应用程序中使用Entity Framework,但是由于修改密钥的限制,EF无法处理此特定命令。值)。 过程具有一些参数(仅IN),并更新表中的值。我通过运行测试了它: 它工作正常。 我的参数定义如下: 我的查询是: 我正在尝试从C#代码执行它。即通过运行: 我收到错误OR
问题内容: 是否可以从另一个存储过程异步调用存储过程? 编辑: 具体地说,我正在使用DB2数据库。颅骨颅骨颅骨颅骨 问题答案: 摘要:是的,如果您的数据库具有消息队列服务。 您可以将消息推送到队列,队列处理器将异步使用它。 Oracle:队列 SQL Server:服务代理 DB2:事件代理 对于“纯”存储过程语言(PL / Sql或T-Sql),答案是否定的,因为它与大多数数据库具有的基本事务模
问题内容: 如果我在SQL中创建一个存储过程并在BEGIN / END TRANSACTION中调用它(),那么此其他存储过程是否也属于事务? 我不知道它是否像C#中的try / catches一样工作。 问题答案: 是的,您在“开始事务”和“提交”(或“回滚”)之间进行的 所有操作都是 事务的一部分。
我如何在服务器的另一个存储过程中执行SQL存储过程?我将如何传递第二个过程的参数。?
异步注解@Async,默认情况下是不生效的,需要的话可以启用. 该加载器有一个可选参数,线程池大小,默认是32,详情可以查阅org.nutz.aop.interceptor.async.AsyncAopIocLoader @IocBy( args={"*json","ioc/", "*anno","net.wendal.nutzbook", "*a