2015-09-01 5 views
0

У меня есть небольшая проблема, и я хочу попросить вас о помощи :)Oracle: Function Parameter - как реализовать?

так, чтобы сделать его простым, im используя базу данных oracle, и я хочу создать «контрольное ограничение» на одной из моих таблиц, то есть ниже ,

Таблица XY

приписывать || Атрибут B || Атрибут C

для атрибута A и B пользователь может добавить все, что захочет - и для атрибута C я хочу использовать «контрольное ограничение», используя определенную пользователем функцию - которая проверяет правильность комбинации A и B или нет.

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

другими словами, пользователь уже добавили 1 к и 3 к B и когда он хочет, чтобы добавить запись для C Я хочу, чтобы (например) проверить, если A + B = 4

я надеюсь, что вы можете мне помочь, потому что им будет бананы прямо сейчас х)

сердечным приветом Алекс

EDIT (копируется из Commen т ниже)

У меня есть 3 таблицы:

  1. GROUP
  2. GROUP_LIST
  3. ТМ

GROUP включает в себя идентификатор GROUP, GROUP_LIST это таблица соединений между GROUP и TM - так в GROUP_LIST Я подключаю GROUP w Ith ТМ - но это можно подключить 1 GROUP с несколькими TM сек фе:

GROUPID || TM 
1  || 1 
1  || 2 
1  || 3 
2  || 1 

и так далее, и моя реальная проблема заключается в следующем: сейчас я хочу проверить на атрибут ТМ, который проверяет, если ТМ I Я пытаюсь заполнить, уже существует в том же GROUPID. Я надеюсь, что теперь его ясно, что мое намерение ...

+0

Ваш вопрос не очень ясен. Какую проверку вы хотите реализовать? Какова роль столбца C? Что вы подразумеваете под: «как только он хочет добавить запись для C, чтобы проверить, есть ли A + B = 4». ? – Rene

+0

Таблица имеет 3 атрибута - A, B и C Если пользователь добавляет новую запись - и уже заполнил A и B, проверка на C - должна проверить, есть ли «A + B = 4» - в противном случае он должен отклонить запись по атрибуту C - например, первая запись: A = 1, B = 3, (проверка на C в порядке, A + B = 4!) C = 7 Вторая запись: A = 2, B = 3, (проверить на C не нормально, A + B! = 4!) C = (null [no entry possible duo check]) – Alex

+0

Да, я получил это. – Rene

ответ

1

Если вы используете Ouf-линию синтаксис проверочного ограничения можно определить состояние с каким-либо из полех конкретной таблицы, что-то вроде:

ALTER TABLE xy ADD CONSTRAINT mymulticheck CHECK (A + B = C); 

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

+0

Примечание: значения, которые оценивают tu NULL, всегда принимают все условие, поэтому в вашем сценарии до тех пор, пока C не будет содержать NULL в строке, вы можете свободно вставлять любое значение в A и B в той же строке. – dbra

+0

Да, хорошо - может быть необходимо объяснить мои желания более подробно. я есть 3 таблицы: 1. GROUP 2. GROUP_LIST 3. ТМ так GROUP включает в себя идентификатор из группы, GROUP_LIST является connectiontable между группой и ТМ - это в GROUP_LIST я соединить группу с TM - но его можно подключить 1 GROUP с несколькими ТМ fe: GROUPID || TM 1 || 1 1 || 2 1 || 3 2 || 1 и т. Д. и моя настоящая проблема следующая: теперь я хочу проверить на TM attritbute, который проверяет, пытается ли TM, пытающаяся заполнить, уже существует в том же GROUPID - теперь я надеюсь, что мой намерение есть ...:/ – Alex

+0

Проверка запретов не может работать в разных таблицах: единственным возможным решением может быть триггер. – dbra

3

Представляется совершенно бессмысленным требовать от пользователей ввода «правильного» значения для определенного столбца.Вместо определения C как обычная колонку я предлагаю определить его в качестве вычисляемого столбца, например .:

CREATE TABLE TBL 
    (A NUMBER, 
    B NUMBER, 
    C AS (A + B)); 

В этом случае C всегда будет вычислены правильно.

SQLFiddle here

удачи.

EDIT

На основании информации, полученной от ОП в комментарии ниже кажется, что этот ответ не учитывает реальную потребность, так что я добавил второй ответ (ниже). Я решил удалить этот ответ, но поскольку он содержит комментарий от OP, который добавляет важную информацию (которую я уже редактировал в вопросе), я решил оставить этот ответ на месте, но потерял репутацию, сделав этот ответ Community Wiki.

+0

Да, хорошо - может быть необходимо объяснить мои желания более подробно. я есть 3 таблицы: 1. GROUP 2. GROUP_LIST 3. ТМ так GROUP включает в себя идентификатор из группы, GROUP_LIST является connectiontable между группой и ТМ - это в GROUP_LIST я соединить группу с TM - но его можно подключить 1 GROUP с несколькими ТМ fe: GROUPID || TM 1 || 1 1 || 2 1 || 3 2 || 1 и т. Д. и моя настоящая проблема следующая: теперь я хочу проверить на TM attritbute, который проверяет, пытается ли TM im пытаться заполнить, уже существует в том же GROUPID - теперь я надеюсь, что мой намерение есть ...:/ – Alex

+0

@Alex: пожалуйста, не используйте комментарии, чтобы добавить информацию о вашем вопросе. Вы должны отредактировать вопрос, чтобы сделать это. В этом случае я уже добавил эту информацию к вашему вопросу, но помню об этом в будущем. –

0

на основе новой информации, полученной от OP оказывается, что правильный способ решить эту проблему можно было бы добавить ограничение уникальности в таблице GROUP_LIST, чтобы гарантировать, что сочетание GROUP_ID и ТМ уникальна:

ALTER TABLE GROUP_LIST 
    ADD CONSTRAINT GROUP_LIST_UNIQUE_1 
    UNIQUE (GROUP_ID, TM); 

Удачи.