Массив Powershell -notin не сработает, если

Я модифицировал скрипт Flood для выполнения раз для каждой таблицы, а не для каждого столбца каждой таблицы для более быстрого выполнения. Для этого требуется Oracle 11g или больше.

    set serveroutput on size 100000

declare
    v_match_count integer;
    v_counter integer;

    -- The owner of the tables to search through (case-sensitive)
    v_owner varchar2(255) := 'OWNER_NAME';
    -- A string that is part of the data type(s) of the columns to search through (case-insensitive)
    v_data_type varchar2(255) := 'CHAR';
    -- The string to be searched for (case-insensitive)
    v_search_string varchar2(4000) := 'FIND_ME';

    -- Store the SQL to execute for each table in a CLOB to get around the 32767 byte max size for a VARCHAR2 in PL/SQL
    v_sql clob := '';
begin
    for cur_tables in (select owner, table_name from all_tables where owner = v_owner and table_name in 
                       (select table_name from all_tab_columns where owner = all_tables.owner and data_type like '%' ||  upper(v_data_type) || '%')
                       order by table_name) loop
        v_counter := 0;
        v_sql := '';

        for cur_columns in (select column_name from all_tab_columns where 
                            owner = v_owner and table_name = cur_tables.table_name and data_type like '%' || upper(v_data_type) || '%') loop
            if v_counter > 0 then
                v_sql := v_sql || ' or ';
            end if;
            v_sql := v_sql || 'upper(' || cur_columns.column_name || ') like ''%' || upper(v_search_string) || '%''';
            v_counter := v_counter + 1;
        end loop;

        v_sql := 'select count(*) from ' || cur_tables.table_name || ' where ' || v_sql;

        execute immediate v_sql
        into v_match_count;

        if v_match_count > 0 then
            dbms_output.put_line('Match in ' || cur_tables.owner || ': ' || cur_tables.table_name || ' - ' || v_match_count || ' records');
        end if;
    end loop;

    exception
        when others then
            dbms_output.put_line('Error when executing the following: ' || dbms_lob.substr(v_sql, 32600));
end;
/
2
задан RoXaS 15 January 2019 в 20:30
поделиться

1 ответ

Задания PowerShell (типа PSJob) выполняются в отдельном процессе, поэтому они не имеют никакого доступа к среде вызывающей программы, даже к переменным в глобальной области.

Чтобы получить информацию в задании, вы должны определить блок param() в блоке сценария задания, а затем использовать параметр -ArgumentList в Start-Job для отправки значений. Обратите внимание, что это будет однократная передача значений .

Чтобы вернуть данные из задания, вы просто отправляете их по конвейеру, как обычно, и для доступа к данным вам нужно будет использовать Get-Job, чтобы определить, есть ли у задания «дополнительные данные», и если это так , вы используете Receive-Job для извлечения этих данных.

К сожалению, все это означает, что вам все еще нужен ваш основной поток для управления фоновым заданием, чтобы победить цель.

Вы можете вместо заглянуть в [117] и связать его с каким-то объектом .Net, который может вызывать события. Похоже, что они выполняются в процессе, но более того, они могут запускаться на основе событий, которые могут вас заинтересовать, без управления циклом.

Итак, в самом простом и, возможно, просто для ознакомления вы можете взглянуть на пример таймера, где объект таймера запускает событие с интервалом:

$timer = new-object timers.timer 

$action = {write-host "Timer Elapse Event: $(get-date -Format ‘HH:mm:ss’)"} 
$timer.Interval = 3000 #3 seconds  

Register-ObjectEvent -InputObject $timer -EventName elapsed –SourceIdentifier  thetimer -Action $action 

$timer.start()

#to stop run 
$timer.stop() 
#cleanup 
Unregister-Event thetimer

Но примеры на странице Microsoft даже включают мониторинг события создания процесса из WMI, так что и / или и событие выхода из процесса (?), Возможно, стоит посмотреть.

0
ответ дан briantist 15 January 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: