2017-02-13 10 views
0

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

создать таблицу emp (empno varchar2 (5), position varchar2 (5));

создать таблицу информации (empno varchar2 (5), nick varchar2 (20));

empno является основным ключом для обеих таблиц и empno также является внешним ключом для информации.

Теперь я хочу добавить контрольное ограничение, так что кроме gm или ловушки (значение в позиции столбца), ник не должен превышать 16 букв.

Я пробовал метод UDF, как показано ниже.

create function checkPos (@empno varchar2(5)) 
returns bit 
as 
begin 
declare @par bit 

select @par = CASE WHEN pos = 'gm' or pos = 'catcher' 
THEN 0 ELSE 1 END 
FROM emp 
WHERE empno = @empno 

RETURN(@par) 
END 

ALTER TABLE info ADD CONSTRAINT info_nick_ck CHECK (checkPos(empno) * length(nick) <16); 

Однако, он не работает в oracle live sql.

Пожалуйста, помогите. Заранее спасибо.

+2

Вы сказали, что вы используете Oracle, но ваш код выглядит как TSQL код мне – GurV

ответ

0

Ваш код выглядит как код TSQL.

Попробуйте эту функцию в Oracle:

create function checkPos (p_empno varchar2) 
return number 
as 
    v_par number := 0; 
begin 
    select case 
      when pos = 'gm' 
       or pos = 'catcher' 
       then 0 
      else 1 
      end into v_par 
    from emp 
    where empno = p_empno; 

    return v_par; 
exception 
    when no_data_found then 
     dbms_output.put_line('No data found'); 
     -- Do something about it 
end; 
/
+0

Hi гурв, спасибо за Ваш ответ. Я новичок, и я написал UDF после прочтения некоторых предыдущих вопросов и ответов. Не знал, что это TSQL. Сожалею. Я попробовал ваш совет, но ядро ​​оракула в прямом эфире продолжало говорить мне «Ошибки: FUNCTION CHECKPOS PLS-00103: Встретил символ« ALTER ». Есть идеи? –

+0

Я тестировал его на lifeql. Вы добавили косую черту в конце функции? – GurV

+0

Моя вина. Спасибо! После добавления косой черты функция работала. Однако оператор ограничения проверки «ALTER TABLE info ADD CONSTRAINT info_nick_ck CHECK (checkpos (empno) * length (nick) <16);" выдает сообщение «ORA-00904:« CHECKPOS »: недопустимый идентификатор». Зачем? Большое вам спасибо за вашу помощь! –

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

  • Нет связанных вопросов^_^