Oracle Packages
От: STDray http://stdray.livejournal.com
Дата: 16.09.15 14:23
Оценка:
Здравствуйте!


Сгенерировал с помощью t4-шаблона маппинг для базы данных. Но я не вижу классов для хранимых процедур. Насколько я понимаю, это связано с тем, что наши хранимые процедуры лежат в пакетах, а текущая реализация провайдера схемы просто не умеет с ними работать. Это связано с тем, что при реализации возникли какие-то проблемы или просто не учтена эта особенность Оракла?
Re: Oracle Packages
От: IT Россия linq2db.com
Дата: 17.09.15 14:53
Оценка:
Здравствуйте, STDray, Вы писали:

STD>Сгенерировал с помощью t4-шаблона маппинг для базы данных. Но я не вижу классов для хранимых процедур. Насколько я понимаю, это связано с тем, что наши хранимые процедуры лежат в пакетах, а текущая реализация провайдера схемы просто не умеет с ними работать. Это связано с тем, что при реализации возникли какие-то проблемы или просто не учтена эта особенность Оракла?


Похоже, что не умеет. Научите как, сделаем.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Oracle Packages
От: biochemist СССР https://www.anekdot.ru/i/caricatures/normal/20/7/27/1595846503.jpg
Дата: 17.09.15 15:35
Оценка: 37 (1)
Здравствуйте, STDray, Вы писали:

STD>Здравствуйте!



STD>Сгенерировал с помощью t4-шаблона маппинг для базы данных. Но я не вижу классов для хранимых процедур. Насколько я понимаю, это связано с тем, что наши хранимые процедуры лежат в пакетах, а текущая реализация провайдера схемы просто не умеет с ними работать. Это связано с тем, что при реализации возникли какие-то проблемы или просто не учтена эта особенность Оракла?

Вместо
ProcedureID = schema + "." + name,

надо
ProcedureID = schema + "." + package_name + "." + name,

Или name имеет вид "пакадж_нэйм" точка "процедуре_нэйм"

Можно также сделать отдельные процедуры:
Procedure XXX (...)
is
Package_XXX.XXX(...);
end;
Хоть и пахнет рукоблудством, но работать будет.


В любом случае:
Основная причина "не видит" — отсутствие привилегий.
Использование зарегистрированных слов (NAME, OWNER, SCHEMA, etc) в качестве названий переменных приводит к непредсказуемым результатам.
«Национализм во мне столь естественный, что никогда никаким интернационалистам его из меня не вытравить»
Менделеев Д. И.
Re[2]: Oracle Packages
От: STDray http://stdray.livejournal.com
Дата: 21.09.15 21:13
Оценка:
Здравствуйте, IT, Вы писали:

IT>Похоже, что не умеет. Научите как, сделаем.


Потерял тему из вида. Завтра-послезавтра покопаю.
Re[2]: Oracle Packages
От: STDray http://stdray.livejournal.com
Дата: 28.09.15 17:37
Оценка:
Здравствуйте, IT, Вы писали:

IT>Похоже, что не умеет. Научите как, сделаем.


Я покопал немного, оказалось, что никакой проблемы с уровнем привилегий нет. Есть проблема с тем, что возвращает GetSchema для ораклового DataConnection. Во-первых, оно возвращает что-то странное: там нет ни процедур из пакетов, ни функций из данной схемы. Во-вторых, структура возвращаемых данных такова, что информации о пакете там в любом случае нет.

Я начал руками собирать эту метаинформацию https://github.com/stdray/linq2db/commit/62a6fe8709b18b00c066d0176ebe08722c326b23.
В принципе, оно работает для процедур с простыми типами данных (по крайней мере на версии 11.2.0.4.0). Но кроме них есть еще
table,
ref cursor,
pl/sql record

с которыми пока не понятно что делать.

Проблема в том, что это все какие-то пользовательские типы данных (либо табличные, либо описанные вручную записи и курсоры). При этом, сами типы данных могут лежать на другой схеме, соответственно в список таблиц они не попадут. Судя по всему, в DatabaseSchema нужна еще одна коллекция с "дополнительными типами", которые будут кодогенерироваться, но не включаться как таблицы в контекст. Или это сделано как-то иначе?

Еще есть вопрос, как это все можно отлаживать — особенно, что касается t4 шаблонизаторов? То есть собрать новую версию linq2db.dll и запустить генерацию с ее использованием. Пока я просто из консольного приложения вызываю генерацию схемы
            var oracleProvider = new OracleDataProvider();
            var schemaProvider = oracleProvider.GetSchemaProvider();
            var connection = new DataConnection(oracleProvider, conStr);
            var schema = schemaProvider.GetSchema(connection);
            Console.WriteLine(schema);

что не очень удобно.
Re[3]: Oracle Packages
От: IT Россия linq2db.com
Дата: 28.09.15 18:53
Оценка:
Здравствуйте, STDray, Вы писали:

STD>Судя по всему, в DatabaseSchema нужна еще одна коллекция с "дополнительными типами", которые будут кодогенерироваться, но не включаться как таблицы в контекст. Или это сделано как-то иначе?


Если нужна, то можно добавить.

STD>Еще есть вопрос, как это все можно отлаживать — особенно, что касается t4 шаблонизаторов?


Я отлаживаюсь с помощью плагина к решарперу. Вроде как другие плагины тоже что-то умеют.

STD>То есть собрать новую версию linq2db.dll и запустить генерацию с ее использованием. Пока я просто из консольного приложения вызываю генерацию схемы


Так проще всего.
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.