Как упоминалось в jonearles, вы должны написать это в одном выражении SQL.
Если вы настаиваете на использовании PL / SQL: вы слишком много работаете, объявляете переменные, открываете курсоры, зацикливаете, назначаете переменные. Рассмотрим этот PL / SQL:
begin
for c1 in (select * from tab1@dblink1)
loop
for c2 in (Select * from tab2@dblink1 where col1 = c1.col1 and col2 = c1.col2)
loop
insert into local.tab3 values (c1.col1,c1.col2,c2.col1,c2.col2);
end loop;
end loop;
end;
/
В Windows можно использовать программу, чтобы сделать это, потому что кто-то записал программу, которая вставляет драйвер устройства в рабочее ядро, чтобы сделать это. По тому, как может быть опасно сделать это, потому что после закрытия дескриптора, который использовало поврежденное приложение, приложение не знает, что дескриптор был закрыт, и когда приложение открывает некоторый другой несвязанный объект, это не знает, что тот же дескриптор мог бы теперь относиться к некоторому другому несвязанному объекту. Вы действительно хотите уничтожить поврежденное приложение как можно скорее.
В Linux, конечно, можно использовать тот же вид техники. Запишите программу, которая вставляет модуль в рабочее ядро. Свяжитесь с модулем и скажите его который дескрипторы закрыться. Будет одинаково опасно сделать так.
Я не знаю, почему Вы пытаетесь сделать это, но необходимо быть в состоянии присоединить к процессу с помощью gdb и затем звонить близко () на fd. Пример:
В одной оболочке: кошка
В другой оболочке:
$pidof cat
7213
$gdb -p 7213
...
lots of output
...
(gdb)
Теперь Вы говорите gdb выполняться близко (0):
(gdb) p close(0)
$1 = 0
(gdb) c
Continuing.
Program exited with code 01.
(gdb)
В первой оболочке я получаю этот вывод:
cat: -: Bad file descriptor
cat: closing standard input: Bad file descriptor
Я сомневаюсь относительно него. Дескрипторы файлов локальны для процесса, stdout
1 ко всем процессам, все же они все еще ссылочные уникальные потоки, конечно.
, Возможно, больше детали было бы полезно о блокирующейся проблеме, которую Вы пытаетесь решить.
Я не думаю так, но lsof дает Вам PID процесса, который открыл файл, поэтому что можно сделать, полностью уничтожают процесс или по крайней мере отправляют сигнал позволить ему выйти.
Существует намного меньше потребности сделать это на Unix, чем в Windows.
В Windows, большинство программ имеет тенденцию "блокировать" (на самом деле отрицают совместно использовать), файлы, которые они открывают, таким образом, они не могут быть считаны/записаны/удалены другой программой.
На Unix, большую часть времени этого не происходит. Захват файла на Unix является главным образом консультацией и только заблокирует другие попытки блокировки, не нормальный читал/писал/удалял операции. Можно даже удалить текущий каталог процесса.
О единственной ситуации это подходит в нормальном использовании в Unix, при попытке к umount файловой системы (любая ссылка вообще на смонтированную файловую систему может заблокировать umount).