Oracle: Что делает' (+)', делают в операторе Where?

Я поддерживаю хранимые процедуры ( MySQL имеет поддержку хранимых процедур с 5.0 ) с точки зрения безопасности - преимущества -

  1. Большинство баз данных (включая MySQL ) позволяют ограничить доступ пользователей к выполнению хранимых процедур. Четкое управление доступом к безопасности полезно для предотвращения эскалации атак привилегий. Это предотвращает возможность взлома приложений, которые могут быть запущены SQL, непосредственно из базы данных.
  2. Они абстрагируют исходный SQL-запрос из приложения, поэтому для приложения доступно меньше информации о структуре базы данных. Это затрудняет понимание людьми базовой структуры базы данных и разработку подходящих атак.
  3. Они принимают только параметры, поэтому существуют преимущества параметризованных запросов. Конечно, IMO вам все равно нужно дезинфицировать ваш вход, особенно если вы используете динамический SQL внутри хранимой процедуры.

Недостатки -

  1. Они (хранимые процедуры) трудно поддерживать и стремиться к размножению очень быстро. Это делает их проблемой.
  2. Они не очень подходят для динамических запросов - если они созданы для принятия динамического кода в качестве параметров, тогда многие преимущества сбрасываются.

56
задан Jon Seigel 7 April 2010 в 02:28
поделиться

3 ответа

В зависимости от которого идет сторона "="" (+), она обозначает ЛЕВОЕ ВНЕШНЕЕ или ПРАВИЛЬНОЕ Внешнее объединение (в этом случае, это - левое внешнее объединение). Это - старый синтаксис Oracle, который иногда предпочитается людьми, которые изучили его сначала, так как им нравится этот, это делает их код короче.

Лучший для не использования его, хотя, для пользы удобочитаемости.

90
ответ дан SquareCog 26 November 2019 в 17:16
поделиться

Как другие заявили, (+), синтаксис является устаревшим, собственным синтаксисом, что Oracle раньше в течение многих лет выполняла те же результаты как OUTER JOIN. Я предполагаю, что они приняли свой собственный синтаксис, прежде чем SQL-92 выбрал стандартный синтаксис.

эквивалентный запрос к тому, который Вы показали, с помощью стандартного синтаксиса SQL OUTER JOIN (который теперь поддерживается всеми основными реализациями RDBMS) был бы следующим:

SELECT
    Table1.Category1,
    Table1.Category2,
    COUNT(*) AS Total,
    COUNT(Table2.Stat) AS Stat
FROM Table1
  LEFT OUTER JOIN Table2 ON (Table1.PrimaryKey = Table2.ForeignKey)
GROUP BY Table1.Category1, Table1.Category2;

, Что означает:

  • Все строки от Table1 включены в результат запроса.
  • , Где там соответствуют строкам в Table2, включайте те строки (повторяющий содержание от Table1, если существует несколько строк соответствия в Table2).
  • , Где нет никаких строк соответствия в Table2, используйте NULL для всех из [1 110] столбцы в результате запроса.
24
ответ дан Bill Karwin 26 November 2019 в 17:16
поделиться

Это - не ANSI, оставленный нотацию внешнего объединения. Начиная с Oracle9i, запутывающий синтаксис внешнего объединения с помощью †˜ (+) ’ нотация был заменен синтаксисом внешнего объединения ISO 99.

5
ответ дан Otávio Décio 26 November 2019 в 17:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: