2017-02-13 106 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“:无效标识符”。为什么?非常感谢你的帮助! –