2017-02-13 19 views
0

私は以下の2つのテーブルを持っています。複数のテーブルレベルでOracle SQLチェック制約を追加

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

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

empnoは両方のテーブルのプライマリキーで、empnoも親テーブルempを持つinfoの外部キーです。

gmまたはcatcher(column positionの値)を除いて、ニックネームが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

こんにちはGurV、お返事に感謝。私は新しい手です。以前のいくつかの質問と答えを読んだ後、UDFを書いたのです。それがTSQLであることを知らなかった。ごめんなさい。私はあなたのアドバイスを試みましたが、oracle live 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 ":無効な識別子"というエラーが表示されます。どうして?手伝ってくれてどうもありがとう! –

関連する問題