2016-11-01 14 views
2

検査が完了した後に表に情報を追加するプロシージャーを作成しようとしています。チェックの1つは、別のテーブルのフィールドがすでに他のテーブル内に存在するかどうかを比較することです。私は現在、あるフィールドを他のテーブルの列全体と比較して一致するものがあるかどうかを調べる方法を探しています。例えば、
など。 1つのフィールドはPrerequisiteIDで、このIDがコーステーブルCourseIDに存在することを確認する必要があります。私はcourseIDの全列に単一のprerequisiteIDをどのように比較するか検討するのに苦労しています。どんな助けもありがとう。SQLプロシージャー - 値の比較

私がやっている実際の質問は次のとおりです。

は、ブランドの新しいコースを提供するために与えられたコースの詳細を使用して手順NEW_COURSEを書きます。そのための前提条件コース(もしあれば)がすでにCOURSEテーブルに存在し

  1. :新しいコースを開く前に、手順があることを保証します。簡単にするため、コースには1つのコースを前提条件とすることができます。

  2. コースの前提条件は、より低いレベルにする必要があります。たとえば、ISYS326の前提条件は、100レベルまたは200レベルのコースでなければならず、300レベルのコースにはできません。

上記の要件のいずれかが失敗した場合、手続きは適切な警告メッセージを出力し、COURSEテーブルを修正しない例外WRONG_PREREQを発生させます。

テーブルの構造:コースの

CREATE OR REPLACE 
PROCEDURE NEW_COURSE 
(
    c_course_ID  COURSE.COURSEID%type, 
    c_dept_ID   COURSE.DEPTID%type, 
    c_coursename COURSE.COURSENAME%type, 
    c_textbook   COURSE.TEXTBOOK%type, 
    c_credithour  COURSE.CREDITHOUR%type, 
    c_max_enrol  COURSE.MAX_ENROL%type, 
    c_actual_enrol COURSE.ACTUAL_ENROL%type, 
    c_availability  COURSE.AVAILABILITY%type, 
    p_prerequisite_ID HAS_PREREQUISITE.PREREQUISITEID%type 
) 

IS 

BEGIN 

    IF (p_prerequisite_ID != COURSE.courseID) THEN WRONG_PREREQ (-20205, 'That prerequisite does not exist'); 
    ELSE IF(p_prerequisite_ID > c_course_ID) THEN WRONG_PREREQ(-20205, 'That is not a valid prerequisite'); 
    ELSE 
    INSERT INTO COURSE (COURSEID, DEPTID, COURSENAME, TEXTBOOK, CREDITHOUR, MAX_ENROL, ACTUAL_ENROL, AVAILABILITY) 
    VALUES (c_course_ID, c_dept_ID, c_coursename, c_textbook, c_credithour, c_max_enrol, c_actual_enrol, c_availability); 
    END IF; 

END NEW_COURSE; 

データ:これは、これまでのところ、私の手順です

create table COURSE ( 
    COURSEID CHAR(8) not null, 
    DEPTID CHAR(8) not null, 
    COURSENAME VARCHAR2(20), 
    TEXTBOOK VARCHAR2(20), 
    CREDITHOUR NUMBER(2), 
    MAX_ENROL NUMBER(4), 
    ACTUAL_ENROL NUMBER(4), 
    AVAILABILITY NUMBER(4), 
    constraint PK_COURSE primary key (COURSEID) 
); 

create table HAS_PREREQUISITE ( 
    COURSEID CHAR(8) not null, 
    PREREQUISITEID CHAR(8) not null, 
    constraint PK_HAS_PREREQUISITE primary key (COURSEID, PREREQUISITEID) 
); 

alter table HAS_PREREQUISITE 
add constraint FK_HAS_PRER_HAS_PRERE_COURSE foreign key (COURSEID) 
references COURSE (COURSEID); 

alter table HAS_PREREQUISITE 
add constraint FK_HAS_PRER_HAS_PRERE_COURSE1 foreign key (PREREQUISITEID) 
references COURSE (COURSEID); 

、私は私がちょうどそこに何かを取得しようとしています間違っている知っている

+----------+----------+------------+----------+------------+-----------+--------------+--------------+ 
| CourseID | DeptID | COURSENAME | TEXTBOOK | CREDITHOUR | MAX_ENROL | ACTUAL_ENROL | AVAILABILITY | 
+----------+----------+------------+----------+------------+-----------+--------------+--------------+ 
| ISYS224 | FSE  |   |   |   |   |    |    | 
| COMP225 | FSE  |   |   |   |   |    |    | 
| ISYS114 | FSE  |   |   |   |   |    |    | 
| COMP115 | FSE  |   |   |   |   |    |    | 
+----------+----------+------------+----------+------------+-----------+--------------+--------------+ 

前提条件にはデータがありません(彼らは検証し、常に消費するプログラムの一部に余分なコードを伴うことは困難であるため)

+----------------+--------------+ 
| Column Name | Data Type | 
+----------------+--------------+ 
| COURSEID  | CHAR(8 BYTE) | 
| PREREQUISITEID | CHAR(8 BYTE) | 
+----------------+--------------+ 
+0

は、あなたのテーブルのレイアウトはテーブルのコース を(作成 –

+0

表示 COURSEID CHAR(8)nullではない、 DEPTID CHAR(8)nullではないが、 COURSENAME VARCHAR2(20)、 教科書VARCHAR2(20)、 CREDITHOUR番号(2)、 MAX_ENROL番号(4)、 ACTUAL_ENROL番号(4)、 可用性番号(4)、 制約PK_COURSE主キー(COURSEID) )。 – Rainbw

+0

テーブルHAS_PREREQUISITE ( COURSEID CHAR(8)NOT NULL、 PREREQUISITEID CHAR(8)NOT NULL、 制約PK_HAS_PREREQUISITE主キー(COURSEID、PREREQUISITEID) )を作成します。 alter table HAS_PREREQUISITE 制約を追加するFK_HAS_PRER_HAS_PRERE_COURSE外部キー(COURSEID) 参照COURSE(COURSEID); alter table HAS_PREREQUISITE 制約を追加するFK_HAS_PRER_HAS_PRERE_COURSE1外部キー(PREREQUISITEID) 参照COURSE(COURSEID); – Rainbw

答えて

0

それでは、私たちがここに持っていることはスマートキーがあり、スマートキーはダムです:それのためのテーブル定義です。

  • ISYS =対象
  • 2 =コースレベル
  • 24 =クラス番号(例えば)

データモデルが正しかった場合は(と明らかに:ダウン3つの成分へCOURSEID ISYS224休憩それはあなたの先生のせいではありません)、その答えは簡単なものでした。

そのままですが、COURSEIDを自分の構成部分に分解する必要があります。 SUBJECTは常に4文字の長さであると仮定しましょう。他のものはサディスティックなものだからです。次に、クエリは次のとおりです。

select c.courseid 
from course c 
where substr(c.courseid, 1, 4) = substr(p_prerequisite_id, 1, 4) 
and substr(c.courseid, 5, 1) < substr(p_prerequisite_id, 5, 1) 
; 

これは、前提条件がルールに適合しない場合、NO_DATA_FOUNDを発生させます。これをきれいに処理するには、例外セクションを使用してください。

また、前提条件のコースレコードをローカル変数に選択し、PL/SQLコードでチョッピングすることもできます。

select c.courseid into l_prerequisite_course 
from course c 
where c.courseid = p_prerequisite_id; 

if substr(l_prerequisite_course, 1, 4) = substr(p_prerequisite_id, 1, 4) 
or substr(l_prerequisite_course, 5, 1) < substr(p_prerequisite_id, 5, 1) 
then raise ... 
; 
+0

ヒープありがとうございました。一度それが壊れている – Rainbw