powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача массива в хранимую процедуру Oracle
13 сообщений из 13, страница 1 из 1
Передача массива в хранимую процедуру Oracle
    #39598662
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня! Знаю, что это не раз обсуждалось, но решения я не нашел, в интернете полно примеров простого одномерного массива.

В Оракле в процедуре следующее
Код: plsql
1.
2.
3.
4.
procedure Load_currency_course_reuters(
  Cur_Arr_          in  gs_currency_course_load.TCur_Arr,
  WORK_DATE_        in  date,
...



где TCur_Arr это
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type TCur_Rec is record (
  curId        integer,
  curCode      varchar2(3),
  val          numeric,
  course       numeric,
  curNameRus   varchar2(100),
  curNameKaz   varchar2(100),
  curFactor    integer
);

type TCur_Arr  is table of TCur_Rec index by binary_integer;



В C# имеется массив вида
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public struct CurArr
    {
        public int curId;
        public String curCode;
        public double val;
        public double course;
        public String curNameRus;
        public String curNameKaz;
        public int curFactor;
    }



Я пишу так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
OracleCommand command = new OracleCommand("begin gs_currency_course_load.load_currency_course_reuters(:Cur_Arr_, :WORK_DATE_, :Err_Code, :Err_Msg); end;", conn);
            OracleParameter p = new OracleParameter();
            p.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
            p.ParameterName = "Cur_Arr_";
            p.Size = curArr.Length;
            //p.ArrayBindSize = new [][curArr.Length];
            p.Value = curArr;
            p.Direction = ParameterDirection.Input;



Ошибка на "p.Value = curArr;" - Значение не попадает в ожидаемый диапазон.
Пробовал по-разному, что находил в интернете, но ничего не получилось.
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598680
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchik,
Передавайте в виде строки с элементами через разделитель.
А внутри сразу в табличку для join.
Мало ли какие типы в базе есть.imho.
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598681
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

да, я думал над этим, но хочется как-то покрасивше
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598685
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikпокрасивше
Очень сложное понятие в архитектуре.
Неоднозначное.
Например, технически красиво это когда бд не зависит от клиента.
В веб к клиенту передается json а не HTML.
Так и в шарпе красивее передавать через простые типы.
Особенно когда у вас передается массив размеров обуви))))
Удачи!
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598711
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Так и в шарпе красивее передавать через простые типы.
К таким заявлениям следовало бы добавлять "по моему мнению" - а то еще кто-нибудь воспримет их всерьез.

aidynchik,

есть подозрение, что передача массивов работает только для примитивных типов - см. здесь: https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1857352500346934865
Код: c#
1.
2.
ODP.NET does not support binding a table of records (multidimensional array) as this is a limitation of the Oracle Call Interface API.
Fix 1: ODP.NET does support PL/SQL Associative arrays in which you can pass an array of single scalar types.


Выход - сериализуйте массив в XML, передавайте как XMLType (ну, или CLOB - не помню, поддерживает ли ODP xml-тип), и внутри процедуры разбирайте через XMLTable.
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598712
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

ок, спасибо!
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598727
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
В архитектуре всегда неоднозначно и компромиссы)
Сначала xml, потом bulk insert, потом...табличный тип, потом...
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598728
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
Кстати вы Point передаете как x, y или Point?
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598734
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Сон Веры Павловны,
Кстати вы Point передаете как x, y или Point?
Point - скалярный тип, а не массив, как у ТС. В случае массива и при наличии возможности - разумеется, как массив Point.
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598757
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
Возможности понаставить библиотек для поддержки геометрии всегда полно.
А вот понять границу лишних преобразований (оверхед) сложнее.
Какого фига я должен в оракле разбирать xml, если строка 22;44;66 таи парсится одним оператором?
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598768
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Код: c#
1.
open v_refcur for select * from table where instr(входнаяСтрока||',', to_char(id) || ',')>0;


...
NUMBER_LIST_TYPE_GET_LIST_ELEMENTS
IMHO
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598805
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Какого фига я должен в оракле разбирать xml, если строка 22;44;66 таи парсится одним оператором?
Не хочется - ради б-га, не разбирайте, и стройте свои костыли. У автора случай несколько сложнее, чем три числа в строчку, его структура в т.ч. содержит строковые поля - что будете делать, если в одно из них попадет разделитель?
Ну и парсинг XML ничего сверх из себя не представляет, все тот же один оператор XMLTable, на выходе дающий нормальную типизированную выборку.
...
Рейтинг: 0 / 0
Передача массива в хранимую процедуру Oracle
    #39598828
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныодин оператор XMLTable,
Раньше загружался целый COM об. Парсер операционки. Счас не знаю.
Конечно, нужно смотреть в самой бд и ветке по бд.
Согласен.
Я type is record в базе делал в исключительных случаях.
Удачи!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача массива в хранимую процедуру Oracle
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]