Поскольку функция запускается асинхронно, вам следует рассмотреть возможность использования обещания или функции обратного вызова для разрешения / возврата url_check, чтобы получить доступ к нему за пределами функции readFile.
Если вы просто хотите войти, значение url_check console.log(url_check)
должно быть помещено в readFile
Используя CSV, вероятно, самый простой путь, предполагая, что можно быть на 100% уверены, что элементы не будут самостоятельно содержать строки.
Альтернатива, и вероятно более устойчивый, способ сделать это должна создать пользовательский тип как таблицу строк. Предположим, Ваши строки никогда не были дольше, чем 100 символами, затем Вы могли иметь:
CREATE TYPE string_table AS TABLE OF varchar2(100);
Можно затем передать переменную этого типа в хранимую процедуру и сослаться на него непосредственно. В Вашем случае, чем-то вроде этого:
FUNCTION EXECUTE_UPDATE(
identifierList string_table,
value int)
RETURN int
IS
BEGIN
[...other stuff...]
update table1 set col1 = col1 - value
where id in (select column_value from table(identifierList));
RETURN SQL%ROWCOUNT;
END
table()
функция превращает Ваш пользовательский тип в таблицу с отдельным столбцом "COLUMN_VALUE", который можно затем рассматривать как любая другая таблица (так сделайте соединения или, в этом случае, подвыбирают).
Красота этого состоит в том, что Oracle создаст конструктора для Вас, поэтому при вызове хранимой процедуры, которую можно просто записать:
execute_update(string_table('foo','bar','baz'), 32);
Я предполагаю, что можно обработать создание этой команды программно от C#.
Как в стороне, в моей компании у нас есть много этих пользовательских типов, определенных как стандарт для списков строк, удваивается, ints и так далее. Мы также используем Oracle JPublisher, чтобы смочь отобразиться непосредственно от этих типов в соответствующие объекты Java. У меня был беглый взгляд вокруг, но я не мог видеть прямые эквиваленты для C#. Просто мысль, я упомянул бы это в случае, если Java devs сталкиваются с этим вопросом.
Я думаю, что нет никакого прямого способа создать процедуры с переменным количеством параметров. Однако существуют некоторые, по крайней мере, частичные решения проблемы, описанной здесь.
К сожалению, у меня нет опыта со средами.NET.
Почему это должна быть хранимая процедура? Вы могли создать подготовленный оператор программно.
Существует статья на веб-сайте AskTom, который показывает, как создать функцию, чтобы проанализировать строку CSV и использовать это в Вашем операторе похожим способом к данному примеру SQL Server.
См. Asktom
Я не сделал этого для Oracle, но с SQL Server можно использовать функцию для преобразования строки CSV в таблицу, которая может затем использоваться в В пункте. Это должно быть просто для переписывания этого для Oracle (я думаю!)
CREATE Function dbo.CsvToInt ( @Array varchar(1000))
returns @IntTable table
(IntValue nvarchar(100))
AS
begin
declare @separator char(1)
set @separator = ','
declare @separator_position int
declare @array_value varchar(1000)
set @array = @array + ','
while patindex('%,%' , @array) <> 0
begin
select @separator_position = patindex('%,%' , @array)
select @array_value = left(@array, @separator_position - 1)
Insert @IntTable
Values (Cast(@array_value as nvarchar))
select @array = stuff(@array, 1, @separator_position, '')
end
return
end
Затем можно передать в строке CSV (например, '0001,0002,0003') и сделать что-то как
UPDATE table1 SET
col1 = col1 - value
WHERE id in (SELECT * FROM csvToInt(@myParam))
Почему бы просто не использовать длинный список параметров и не загрузить значения в конструктор таблицы? Вот SQL / PSM для этого трюка
UPDATE Foobar
SET x = 42
WHERE Foobar.keycol
IN (SELECT X.parm
FROM (VALUES (in_p01), (in_p02), .., (in_p99)) X(parm)
WHERE X.parm IS NOT NULL);
Я нашел следующую статью Марка А. Уильямса, которая, как я подумал, будет полезным дополнением к этой теме. В статье приведен хороший пример передачи массивов из C # в процессы PL / SQL с использованием ассоциативных массивов (TYPE myType IS TABLE OF mytable.row% TYPE INDEX BY PLS_INTEGER):