2017-02-13 107 views
0

我有兩個表,如下所示。Oracle SQL在多表級別添加檢查約束條件

create table emp(empno varchar2(5),position varchar2(5));

create table info(empno varchar2(5),nick varchar2(20));

empno是兩個表的主鍵,empno也是信息中的外鍵,帶有父表emp。

現在我想添加一個檢查約束,因此除gm或catcher(列位置中的值)之外,nick不應超過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代碼。

試試這個功能在甲骨文:

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

嗨GurV,感謝您的回覆。我是一位新手,在閱讀了一些以前的問題和答案後,我寫了UDF。不知道那是TSQL。抱歉。我試過你的建議,但甲骨文活sql一直告訴我「錯誤:功能CHECKPOS PLS-00103:遇到符號」ALTER「」。有任何想法嗎? –

+0

我在livesql上測試過它。你在函數結尾添加了正斜槓嗎? – GurV

+0

我的錯。謝謝!在添加正斜槓後,該功能起作用。但是,檢查約束語句「ALTER TABLE info ADD CONSTRAINT info_nick_ck CHECK(checkPos(empno)* length(nick)<16);」給出一個錯誤說「ORA-00904:」CHECKPOS「:無效標識符」。爲什麼?非常感謝你的幫助! –