Здравствуйте!
Сгенерировал с помощью t4-шаблона маппинг для базы данных. Но я не вижу классов для хранимых процедур. Насколько я понимаю, это связано с тем, что наши хранимые процедуры лежат в пакетах, а
текущая реализация провайдера схемы просто не умеет с ними работать. Это связано с тем, что при реализации возникли какие-то проблемы или просто не учтена эта особенность Оракла?
Здравствуйте, STDray, Вы писали:
STD>Сгенерировал с помощью t4-шаблона маппинг для базы данных. Но я не вижу классов для хранимых процедур. Насколько я понимаю, это связано с тем, что наши хранимые процедуры лежат в пакетах, а текущая реализация провайдера схемы просто не умеет с ними работать. Это связано с тем, что при реализации возникли какие-то проблемы или просто не учтена эта особенность Оракла?
Похоже, что не умеет. Научите как, сделаем.
Здравствуйте, STDray, Вы писали:
STD>Здравствуйте!
STD>Сгенерировал с помощью t4-шаблона маппинг для базы данных. Но я не вижу классов для хранимых процедур. Насколько я понимаю, это связано с тем, что наши хранимые процедуры лежат в пакетах, а текущая реализация провайдера схемы просто не умеет с ними работать. Это связано с тем, что при реализации возникли какие-то проблемы или просто не учтена эта особенность Оракла?
Вместо
ProcedureID = schema + "." + name,
надо
ProcedureID = schema + "." + package_name + "." + name,
Или name имеет вид "пакадж_нэйм" точка "процедуре_нэйм"
Можно также сделать отдельные процедуры:
Procedure XXX (...)
is
Package_XXX.XXX(...);
end;
Хоть и пахнет рукоблудством, но работать будет.
В любом случае:
Основная причина "не видит" — отсутствие привилегий.
Использование зарегистрированных слов (NAME, OWNER, SCHEMA, etc) в качестве названий переменных приводит к непредсказуемым результатам.
«Национализм во мне столь естественный, что никогда никаким интернационалистам его из меня не вытравить»
Менделеев Д. И.
Здравствуйте, 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);
что не очень удобно.