daviseban Ответов: 3

Как преобразовать oracle VARRAY в SQL SERVER


Привет,

Я работаю в задаче миграции oracle в sql server, и я застрял в том месте, где мне нужно преобразовать тип в oracle, который выглядит следующим образом:

создание или замена типа Q_ARRAY
является ли varray(2000) из VARCHAR2(11);

в Oracle.

Любая помощь в этом вопросе будет оценена по достоинству..
спасибо,
Дейв

Что я уже пробовал:

Я не получил точного преобразования варрея. Я новичок в sql, извините

Richard Deeming

Я не думаю, что есть прямой эквивалент. Может быть, а табличная переменная[^] будет работать?

Табличные переменные в T-SQL[^]

3 Ответов

Рейтинг:
23

Wendelius

Насколько я знаю, точного соответствия VARRAY в SQL Server не существует, по крайней мере, со всеми функциями сбора данных.

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

-- Define the type, valid only inside the batch
DECLARE @SomeList TABLE ( col1 int );

-- Add some data
INSERT INTO @SomeList (col1) values
(1), (2), (3), (4)

--Set based operation
BEGIN
   SELECT * FROM @SomeList
END;

-- The result is 
--   col1
--   1
--   2
--   3
--   4

--Cursor based operation to handle individual rows
BEGIN
   DECLARE @col1value int;
   DECLARE ListCursor CURSOR FOR SELECT col1 FROM @SomeList;
   OPEN ListCursor;
   FETCH NEXT FROM ListCursor INTO @col1value;
   WHILE @@FETCH_STATUS = 0  BEGIN 
      PRINT 'Col1 value is '+ CAST(@col1value AS varchar(100))
      FETCH NEXT FROM ListCursor INTO @col1value;
   END;
END ;
-- the result is 
--    Col1 value is 1
--    Col1 value is 2
--    Col1 value is 3
--    Col1 value is 4
GO

Этот тип также может быть постоянным, как и в Oracle. В таком случае вам нужно создать тип отдельно. Посмотрите пример на сайте Как передать несколько записей в хранимую процедуру[^]

Также помните, что SQL Server не имеет понятия пакетов, поэтому вы не можете определить открытые типы и код в одном модуле.


daviseban

Спасибо майку Венделиусу за ваше решение.
VARRAY используется для передачи массива значений параметров из java в хранимый proc.
Пожалуйста, взгляните на этот java-код здесь:

Массив string [] = "список".toArray(новая строка[list.size()]);
ArrayDescriptor arraydesc = ArrayDescriptor.createDescriptor
("MY_DBSCHEMA.Q_ARRAY", соединение);
oracle.sql.ARRAY argArray = новый oracle.sql.ARRAY(arraydesc,соединение, массив);

Я использую ojdbc6.jar -здесь.
Но это очень специфично для оракула.
Можем ли мы добиться того же с помощью табличных типов в sql?

В принципе, мне нужно передать массив строк..
заранее спасибо

Wendelius

Я должен признать, что мои навыки Java находятся в ржавчине, поэтому я не совсем уверен в текущей ситуации. Однако, похоже, что табличные параметры поддерживаются начиная с JDBC 6.0 (MS). Видеть Использование Табличных Параметров[^]

daviseban

хорошо ... большое вам спасибо.

Wendelius

Всегда пожалуйста :)

Рейтинг:
0

daviseban

Я много чего перепробовал и наконец нашел решение..

Вместо VARRAY в Oracle a я создал тип таблицы в SQL server следующим образом:

CREATE TYPE dbo.Q_ARRAY
AS TABLE
(
  Q_ID VARCHAR(11)
);
GO


Это используется в сохраненном proc в качестве аргумента, и мне нужно передать строковый массив в этот сохраненный proc из java.
Я смог сделать это с помощью приведенного ниже кода java:

SQLServerDataTable qDT = new SQLServerDataTable(); 
				vehDT.addColumnMetadata("Q_ID", java.sql.Types.VARCHAR);
				vehDT.addRow("11122369");
				vehDT.addRow("45523264");
				
				
				SQLServerPreparedStatement spStat = (SQLServerPreparedStatement)con.prepareStatement("{call [dbo].[process_qRequest](?)}");
				spStat.setStructured(1, "dbo.Q_ARRAY", qDT);


Это работает как чемпион!!
Здесь я использую банку sqljdbc41.
Обратите внимание, что старые банки sql jdbc не предоставляют многих из этих функций.

спасибо,
Дейв


Рейтинг:
0

Member 13523765

может ли кто-нибудь помочь со ссылкой для скачивания sqljdbc4.jar-что?


CHill60

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