Я не большой гуру в Activiti, но в качестве простейшего решения могу предложить активировать Async executor и использовать Asynchronous Continuations для решения служебных задач. Это может решить вашу проблему. Поведение Activiti ожидается, потому что до тех пор, пока оно не сохранит состояние в БД, он не может точно сказать, что процесс создан (потому что транзакция может быть откатана из-за ошибки БД, например)
Учитывая, что Вы сказали использование Oracle, я просто запрошу метаданные.
select table_name, max(num_rows) from all_tables where table_name in ('A', 'B', 'C');
Просто видел Ваше редактирование. Просто выполненное вышеупомянутое без, куда пункт и это возвратят самую большую таблицу в базе данных. Только проблема может состоять в том, что Вы могли бы получить таблицу SYS$ или что-то. Поочередно, если Вы просто делаете, это для Вашего собственного знания просто делает
select table_name, num_rows from all_tables order by num_rows;
и Вы будете видеть, каковы самые большие.
Таблица в Вашей схеме, которая имеет макс. строки:
with data as
(
select table_name,
to_number(extractvalue(xmltype(
dbms_xmlgen.getxml (
' select count(*) c from ' || table_name)),
'/ROWSET/ROW/C')) countrows
from user_tables
)
select table_name, countrows
from data
where countrows = (select max(countrows)
from data);
dbms_xmlgen.getxml (' выбор....') чрезвычайно гибок.
Вот другой метод, вероятно, чтобы быть намного медленнее, чем простое получение ALL_TABLES.NUM_ROWS, но это не зависит от собранной статистики и дает точные, текущие значения - хотя, как текущий зависит от того, сколько времени это берет для выполнения!
-- For running in SQLPlus you need this to see the output.
-- If running in Toad or similar tool, output is enabled by default
SET SERVEROUTPUT ON SIZE 100000
DECLARE
l_rows INTEGER;
l_max_rows INTEGER := 0;
l_table_name all_tables.table_name%TYPE := NULL;
BEGIN
FOR table_record IN (SELECT table_name FROM all_tables) LOOP
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||table_record.table_name
INTO l_rows;
IF l_rows > l_max_rows THEN
l_max_rows := l_rows;
l_table_name := table_record.table_name;
END IF;
END LOOP;
IF l_table_name IS NULL THEN
dbms_output.put_line( 'All tables are empty' );
ELSE
dbms_output.put_line( 'Table ' || table_record.table_name ||
' has ' || TO_CHAR(l_max_rows) || ' rows'
);
END IF;
END;
/
select max(select count(*) from A union select count(*) from B...)
должен работать.
править: если Вы хотите что-то динамическое, можно создать строку в МН / SQL с каждым "количеством (*)" подзапрос (например, перечислив имена таблиц от USER_TABLES), и затем выполнить te основной запрос с:
execute immediate 'select max('||subquery||')'
Вы могли получить тот же результат с одним тралом данных как так:
SELECT DISTINCT
FIRST_VALUE ( t.owner )
OVER ( ORDER BY t.num_rows DESC NULLS LAST )
owner,
FIRST_VALUE ( t.table_name )
OVER ( ORDER BY t.num_rows DESC NULLS LAST )
table_name,
FIRST_VALUE ( t.num_rows )
OVER ( ORDER BY t.num_rows DESC NULLS LAST )
num_rows
FROM all_tables t
David Aldridge правильно указывает, что запросы all_tables могли дать неправильные результаты из-за пропавших без вести или лишить статистику таблицы новизны. Но существует также проблема с использованием user_segments; Удаленные блоки под меткой паводка все еще считались бы для размера таблицы.
Пример:
SQL>create table t as select * from all_objects
Table created.
SQL>select blocks, bytes from user_segments where segment_name = 'T';
BLOCKS BYTES
---------- ----------
768 6291456
SQL>delete from t
52676 rows deleted.
SQL>commit;
Commit complete.
SQL>select count(*) from t;
COUNT(*)
----------
0
SQL>select blocks, bytes from user_segments where segment_name = 'T';
BLOCKS BYTES
---------- ----------
768 6291456
SQL>truncate table t;
Table truncated.
SQL>select blocks, bytes from user_segments where segment_name = 'T';
BLOCKS BYTES
---------- ----------
8 65536