Функция SQL, которая принимает таблицу и список столбцов в качестве параметров - PullRequest
0 голосов
/ 05 октября 2018

У меня есть база данных с несколькими таблицами сопоставления.

Каждая из таблиц сопоставления содержит группу ключевых столбцов, сопоставленное значение и диапазон дат, когда сопоставление применимо.

Например,

mappingtable_a (
  acol,
  bcol,
  ccol,
  mapped,
  startdate,
  enddate
)

Я мог бы использовать это следующим образом

select
  a.acol,
  a.bcol,
  a.ccol,
  m.mapped
from
  atable a left join
  mappingtable_a m on (
    a.acol = m.acol and
    a.bcol = m.bcol and
    a.ccol = m.ccol and
    a.adate >= m.startdate and
    a.adate <= m.enddate
  )

Я хочу включить проверку ограничений для этих таблиц, чтобы убедиться, что в них никогда не будет совпаденийдиапазоны дат для комбинации столбцов сопоставления.

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

function checkrange_mappingtable_a(
  acol_value,
  bcol_value,
  ccol_value,
  startdate_value,
  enddate_value
) {
  --find all date ranges for this combination in mappingtable_a
  --verify the new range doesn't overlap
}

Мне интересно, могу ли я создать функцию, которая будет обрабатывать все мои таблицы сопоставления, а не по отдельности.

Что-то вроде

function checkrange (
  thetable,
  columnlist,
  valuelist,
  startdate_value,
  enddate_value
) {
  --find all date ranges in thetable where columnlist=valuelist
  --verify the new range doesn't overlap
}

, которое затем можно было бы передать как-то так дляmappingtable_a.

checkrange(
  'mappingtable_a',
  ['acol','bcol','ccol'],
  [acol_value,bcol_value,ccol_value],
  startdate_value,
  enddate_value
)

Я на приличном пути?Я бы предпочел пойти по этому пути, так как это избавило бы от необходимости создавать функцию для каждой таблицы.

1 Ответ

0 голосов
/ 05 октября 2018

Нет, вы не сможете создать функцию, которая обычно обрабатывает несколько таблиц, потому что для этого требуется динамический sql, а динамический sql не разрешен в пользовательских функциях.

Альтернативаidea : поместите все диапазоны дат сопоставления в одну таблицу.Поскольку в смежных таблицах не всегда может быть одинаковое количество ключевых столбцов, это означает, что в некоторых сопоставлениях в некоторых ключевых столбцах будут значения NULL, но вы все равно проигнорируете эти столбцы в соединениях для этой таблицы.Вам также необходимо добавить столбец TableName в таблицу сопоставлений, чтобы отделить отображение TableA / ColumnA от сопоставления TableB / ColumnA, но я не вижу в этом большого значения.

Таким образом, у вас будет ограничение диапазона дат в одной таблице, и вы можете присоединить к нему любую таблицу следующим образом:

select
  a.acol,
  a.bcol,
  a.ccol,
  m.mapped
from
  atable a left join
  mappingtable m on (
    m.TableName = 'atable' and
    a.acol = m.acol and
    a.bcol = m.bcol and
    a.ccol = m.ccol and
    a.adate >= m.startdate and
    a.adate <= m.enddate
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...