【问题标题】:Oracle SQL add check constraint at multiple table levelOracle SQL在多表级别添加检查约束
【发布时间】:2017-07-01 23:05:46
【问题描述】:

我有两张如下表。

创建表emp(empno varchar2(5), position varchar2(5));

创建表信息 (empno varchar2(5), nick varchar2(20));

empno是两个表的主键,empno也是info中的外键,父表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 中不起作用。

请帮忙。提前谢谢你。

【问题讨论】:

  • 你说你使用的是Oracle,但你的代码在我看来更像是TSQL代码

标签: sql oracle multiple-tables check-constraint


【解决方案1】:

您的代码看起来像 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;
/

【讨论】:

  • 您好 GurV,感谢您的回复。我是新手,在阅读了一些以前的问题和答案后,我编写了 UDF。不知道那是TSQL。对不起。我尝试了您的建议,但 oracle live sql 一直告诉我“错误:FUNCTION CHECKPOS PLS-00103:遇到符号“ALTER””。有什么想法吗?
  • 我在livesql上测试过。你在函数末尾添加了正斜杠吗?
  • 我的错。谢谢!添加正斜杠后,该功能起作用。但是,检查约束语句“ALTER TABLE info ADD CONSTRAINT info_nick_ck CHECK (checkPos(empno) * length(nick)
猜你喜欢
  • 2014-05-11
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多