Хранимая процедура Oracle с параметрами для В пункте

Поскольку функция запускается асинхронно, вам следует рассмотреть возможность использования обещания или функции обратного вызова для разрешения / возврата url_check, чтобы получить доступ к нему за пределами функции readFile.

Если вы просто хотите войти, значение url_check console.log(url_check) должно быть помещено в readFile

13
задан MozenRath 10 April 2013 в 06:39
поделиться

7 ответов

Используя 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 сталкиваются с этим вопросом.

27
ответ дан 1 December 2019 в 21:12
поделиться

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

  1. Если существует некоторая типичная перегрузка процедуры типов вызова, может помочь.
  2. Если существует верхний предел в количестве параметров (и их тип также известен заранее), значения по умолчанию параметров могут помочь.
  3. Наилучшим вариантом является, возможно, использование переменных курсора, что указатели к курсорам базы данных.

К сожалению, у меня нет опыта со средами.NET.

1
ответ дан 1 December 2019 в 21:12
поделиться

Почему это должна быть хранимая процедура? Вы могли создать подготовленный оператор программно.

-1
ответ дан 1 December 2019 в 21:12
поделиться

Существует статья на веб-сайте AskTom, который показывает, как создать функцию, чтобы проанализировать строку CSV и использовать это в Вашем операторе похожим способом к данному примеру SQL Server.

См. Asktom

-1
ответ дан 1 December 2019 в 21:12
поделиться

Я не сделал этого для 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)) 
-1
ответ дан 1 December 2019 в 21:12
поделиться

Почему бы просто не использовать длинный список параметров и не загрузить значения в конструктор таблицы? Вот 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);
0
ответ дан 1 December 2019 в 21:12
поделиться

Я нашел следующую статью Марка А. Уильямса, которая, как я подумал, будет полезным дополнением к этой теме. В статье приведен хороший пример передачи массивов из C # в процессы PL / SQL с использованием ассоциативных массивов (TYPE myType IS TABLE OF mytable.row% TYPE INDEX BY PLS_INTEGER):

Отличная статья Марка А. Уильямса

2
ответ дан 1 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

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