2009-10-30 2 views
2

Хорошо, я дошел до тупика.Реализация функций кодирования Oracle

В моем проекте с открытым исходным кодом, на базе браузера базы данных Oracle на базе .NET, я реализовал множество инструментов рефакторинга. Все идет нормально. Единственной особенностью, которую я действительно надеялся реализовать, был большой «Глобальный реформат», который бы соответствовал стандартам (скрипты, функции, процедуры, пакеты, представления и т. Д.). (Я всегда был опечален отсутствием достойных инструментов рефакторинга SQL и хотел что-то с этим поделать.)

К сожалению, я, к большому огорчению, обнаруживаю, что, похоже, широко используемый или даже «общепринятый» стандарт для PL-SQL. Такой подход мешает моим планам внедрения.

Мой поиск был достаточно исчерпывающим. Я нашел много противоречивых документов, потоков и статей, и мнения довольно разнообразны. (Размещение Comma, всех вещей, кажется, генерировать довольно много дискуссий.)

Так я столкнулся с несколькими вариантами:

  • Добавить функцию, которая позволяет пользователю настроить стандарт и затем переформатируйте код в соответствии с этим стандартом.

-ИЛИ-

  • Добавить функцию, которая позволяет пользователю настроить стандарт и просто создать список нарушений, как StyleCop делает, оставляя нетронутую SQL.

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

В любом случае у меня по-прежнему нет стандарта. То, что мне нужно знать от вас, ребята, похоже, опробовано, но отчасти это не так. Если вы собираетесь использовать такой инструмент, какие части вашего кода SQL вы хотите, чтобы он вас предупреждал или исправлял?

Опять же, я просто в недоумении из-за отсутствия единого стандарта. И учитывая, что нет ничего, что официально опубликовано Oracle, я думаю, что это то, что сообщество может взвесить. Кроме того, учитывая то, как голосование работает на SO, голоса помогут установить популярность данного «рефакторинга».

P.S. Двигатель анализирует SQL в дереве выражений, чтобы он мог эффективно анализировать SQL и переформатировать его. Должно быть совсем немного, что мы можем сделать, чтобы исправить формат SQL. Но я думаю, что для первого выпуска вещи, макет является основной задачей. Хотя стоит отметить, что в этой вещи уже есть рефакторинг для преобразования ключевых слов в верхний регистр и идентификаторы в нижний регистр.

+0

Чистый SQL довольно прост. Там, где я нахожу инструменты, неэффективно работает с встроенными функциональными вызовами или глубоко вложенными операторами DECODE и/или NVL. – kurosch

+0

Да, это сложно. Особенно, если пользователь указал, что они хотят разрыва строки после закрытия круглых скобок, с отступом. Конечные результаты впечатляют.: -O –

ответ

1

PL/SQL является производным от Ada, однако руководство по стилю Ada почти так же круто скручивается, как и большинство «старых школьных» DB-людей. (Тот, где вы должны думать фуражки замок застрял очень плохо)

Стик с тем, что вы уже знаете из .Net, что означает разумные идентификаторы, без шифрования/сжатия половину базы данных в 30 символов.
Вы можете использовать словарь и разделить части идентификатора с верблюжьим или подчеркнутым идентификатором и проверить, являются ли они настоящими словами. Кажется, что делает FxCop. Может быть, это раздражает. Поскольку средняя база данных Oracle имеет самые жестокие и непоследовательные принципы именования, которые были устаревшими даже 30 лет назад. Итак, я не думаю, что вы достигнете цели получения чистых идентификаторов во всех проектах (или ваших пользователей).

Поскольку PL/SQL не учитывает регистр, а столбцы предпочтительнее, чем в одинаково названных локальных варах, придется делать еще больше компромиссов. Вы можете взять части руководства по стилю других производных паскаля (Ada основана на Modula, которая основана на Pascal), например Delphi, которые немного ближе к дому для PL/SQL (я использую смесь .Net & Delphi) , Особенно «aPrefix» для параметров могут быть спасателем жизни, потому что вы не будете сталкиваться с именами столбцов таким образом:

subtype TName is SomeTable.Name%type; 
subtype TId is SomeTable.Id%type; 

function Test(aName in TName) return TId is 
    result TId; 
begin 
    SELECT t.Id 
    INTO result 
    FROM SomeTable t 
    WHERE t.Name = aName; 

    return result; 
exception 
    when No_Data_Found then 
    return null; 
end; 

без префикса, оракул всегда будет выбрать столбец «Имя», а не параметр "Имя". (Который довольно раздражает, так как столбцы могут быть квалифицированы с псевдонимом ...)

Я настроил свой PL/SQL Devloper, чтобы сделать все ключевые слова в нижнем регистре, однако я сделал те, которые используются в простом SQL, чтобы быть uppercased (SELECT, WHERE и т. д.) В результате SQL-файлы выходят из кода, но не весь мой код должен быть подвергнут жестокому обращению с помощью всех верхних ключевых слов. (Они подсвечены в любом случае, так что же происходит со всем верхним фетишем? ;-))

Когда ваш инструмент способен идентифицировать простые SQL-запросы и дает некоторую визуальную подсказку, тогда даже ключевые слова SQL не должны иметь другой корпус.

Кстати, я хотел бы взглянуть на него. Можете ли вы опубликовать URL-адрес или все еще «под прикрытием»? Cheers, Robert

+0

В настоящее время все еще под обложками, с несколькими основными ошибками для разработки. Но если вы пришлете мне электронное письмо (я думаю, вы можете это сделать отсюда), мы что-то выработаем. –

+0

Нет, никаких частных сообщений на SO. Это легко: firstname dot lastname в gmail. –

1

TOAD имеет «симпатичный принтер» и использует тонну опций, чтобы дать пользователю возможность сказать, что сделано. (Но это стало настолько сложным, что я до сих пор не могу получить результаты, которые мне бы хотелось.)

Для меня некоторые варианты выглядят нисходящими, но кажется, что некоторым их нравится. Разумный дефолт должен быть в порядке в 80% случаев, но поскольку это проблема религиозных войн, я уверен, что вы можете потратить совершенно необоснованное количество времени на довольно небольшие результаты.Я предлагаю закодировать некоторые вещи для обработки 10-летнего sp, о которых вы упомянули, и включить что-то вроде тега <pre>, который красивый принтер оставляет в покое.

0

Если все, что вы делаете, это перестановка пробелов, чтобы код выглядел последовательно чистым, тогда нет риска изменения результатов SQL.

Однако, как разработчик Oracle/PLSQL за последние 8 лет, я почти гарантирую, что не буду использовать ваш инструмент независимо от того, сколько вариантов вы ему дадите. Массовое переформатирование кода в принципе звучит отлично, но тогда вы полностью уничтожили его неустойчивость в управлении версиями между изменениями до и после переформатирования.

+0

Когда форматирование работает очень детерминированным, вы получаете еще более высокую степень размытости, поскольку у вас не будет различий из-за разного отступа или капитализации. –

+0

Хорошо, я не рассматривал возможность использовать его для создания новой «базовой линии» для каждого файла, идущего вперёд. – kurosch

1

Мне нравится «стандартный» Том Ките (в его книгах). Это означает все в нижнем регистре. Наиболее легко для глаз.

Смежные вопросы