2017-02-16 20 views
0

У меня есть следующий вопрос ...хранимой процедуры обновления таблицы в SQL

У меня есть три переменной v1, v2, v2 (все имеют тип java.util.ArrayList). Я хочу написать хранимую процедуру, которая примет эту переменную в качестве ввода и обновит одну таблицу.

Как я могу зациклить список массивов переменной в sql и обновить таблицу? Например, значения для v1 (10, 11, 12), v2 (21,22,23), v3 (31,32,33). Обновление SQL таблицы должно произойти следующим Table1: Row1: 10,21,31 row2: 11,22,32 Row3: 12,23,33

Я буду благодарен, если кто-то может вернуться мне о том, как написать процедуру магазина для этого.

+0

Вы пробовали что-нибудь? Создал хранимую процедуру? Попытка перечислить переменные? Обновить таблицы? – Forklift

+1

Какая база данных? Какой поставщик доступа к данным вы используете? –

+0

Да, я новичок в хранимой процедуре, но я только что написал запрос на обновление, который обновляет одно значение строки. Я мог бы легко использовать Java или любой другой язык программирования, но приложение, с которым я работаю, позволяет мне писать хранимую процедуру ... вот почему я хотел понять, возможно ли это сделать с помощью хранимой процедуры, чтобы обойти переменную arraylist ? – user3384231

ответ

0

Я использовал этот подход, и он отлично подходит для меня.

Имейте хранимую процедуру для получения трех переменных: varchar(max) - если вы знаете размер, вы можете написать номер вместо max. Например:

create procedure usp_testSP 
    @v1 varchar(max), 
    @v2 varchar(max), 
    @v3 varchar(max) 
as 
begin 
    declare @v1Values table (number int); 

    insert into @v1values 
    select * from dbo.fnSplit(@v1,','); -- the fnSplit function is given below 

    -- this way you can retrieve all values for other two variables 
    -- then you can use the corresponding tables, i.e.: @v1Values to complete the steps you need to. 
end 

Вот код dbo.fnSplit(@inputList, @delimiter):

CREATE FUNCTION [dbo].[fnSplit](@sInputList VARCHAR(max), @sDelimiter VARCHAR(10) = ',') 
RETURNS @List TABLE (item varchar(100)) 
BEGIN 
    DECLARE @sItem varchar(100) 
    WHILE CHARINDEX(@sDelimiter, @sInputList, 0) <> 0 
    BEGIN 

     SELECT @sItem = RTRIM(LTRIM(SUBSTRING(@sInputList, 1, CHARINDEX(@sDelimiter, @sInputList,0) - 1))), 
       @sInputList = RTRIM(LTRIM(SUBSTRING(@sInputList, CHARINDEX(@sDelimiter, @sInputList, 0) + LEN(@sDelimiter),LEN(@sInputList)))) 

     IF LEN(@sItem) > 0 

     INSERT INTO @List SELECT @sItem 

    END 

    IF LEN(@sInputList) > 0 
    BEGIN 
     INSERT INTO @List SELECT @sInputList 
    END 
    RETURN 
END 

И, наконец, в коде Java, вы можете преобразовать список в строку и передать его в вызове хранимой процедуры.

List<Integer> v1; //suppose this is the list that contains the values. 
String s = String.join("," /*this is the delimiter. It should be the same as the one you use when you call the dbo.fnSplit() function.*/, v1);