2016-07-24 15 views
-2

何かがオフになっていますが、何が欠けているのかわかりません。ORA-06550 PL/SQLプロシージャを作成しようとするとエラーが発生する

select 
     grade.sectionid, 
     grade.studentid, 
     course.courseid 
    FROM section 
     INNER JOIN grade 
       ON grade.sectionid = section.sectionid 
     INNER JOIN course 
       ON course.courseid = section.courseid; 




DECLARE 
    CURSOR mycursor is 
     select 
     sectionid, studentid, courseid, coursename 
     FROM grade, course, section;  
    var_secID NUMBER(10); 
    var_studentID NUMBER (10); 
    var_gradeLetter CHAR(1); 
    var_coursetitle VARCHAR2(25); 


BEGIN 
    OPEN mycursor; 
LOOP 
     FETCH mycursor 
     INTO var_secID, var_studentID, var_gradeLetter, var_coursetitle; 
     EXIT WHEN mycursor%NOTFOUND; 
     If var_coursetitle(coursename,1) BETWEEN A AND F then 
     UPDATE grade 
     SET grade = 'A' 
     WHERE sectionid; 
     END IF; 
END LOOP; 
CLOSE mycursor; 
END; 
/

このエラーを取得してください:21行で

ERROR:

ORA-06550:行21、列18:

PL/SQL:ORA-00920:無効な関係演算子を

ORA-06550:行19、列4:

PL/SQL:SQLステートメント

+1

カーソル定義の結合は... ....... FROMグレード、コース、セクション。 'は3つのテーブルのクロス結合を作成します(これらの3つのテーブルからすべての行のすべての組み合わせを生成します)。このクエリを使用して何を達成したいのかよく分かりません。 – krokodilko

+0

私はグレードテーブルにグレードを設定するトリガーを作成しました。私は、学生のコース名の最後の手紙を見て、その最後の手紙に応じて学年(A-F)を割り当てる手順を欲しがっています。それは明確にするのに役立ちますか?(これは初めてデータベースやSQLを使って作業しているので、私はまだ非常に新しく、物事を理解しようとしています)。 – ecooper10

+1

最後に、あなたは '...更新階... WHEREセクションid;'それはどういう意味ですか?セクションid **何**?そこに何かがありません。 – mathguy

答えて

1
BETWEEN A AND F then 

を無視することは、おそらく次のようになります。あなたのように、任意のPL/SQLずにそれを行うことができ

BETWEEN 'A' and 'F' then 
0

:PL/SQLの学習運動としてしかし

update grade g set grade = 'A' 
where g.sectionid in 
     (select s.sectionid from section s 
       join course c on c.courseid = s.courseid 
     where substr(c.coursename,-1, 1) between 'A' and 'F'); 

、あなたが行うことができます変数またはカーソル管理のないもの:

begin 
    for r in (
     select g.sectionid, g.studentid, c.courseid, c.coursename 
      , substr(c.coursename,-1, 1) as course_lastchar 
     from grade g 
       join section s on s.sectionid = g.sectionid 
       join course c on c.courseid = s.courseid 
     for update of grade 
    ) 
    loop 
     if r.course_lastchar between 'A' and 'F' then 
      update grade set grade = 'A' where sectionid = r.sectionid; 
     end if; 
    end loop; 
end; 

(一貫したインデントサイズできれいにコードを敷設する習慣に入る価値があります)

関連する問題