2012-02-21 14 views
0

これはPL SQLで初めて実行されたため、何らかの愚かなエラーが発生する可能性があります。 Oracle Express Edition 11gにプロシージャを作成しようとしています。私は、プロシージャ本体のWITH句と関係しているエラーに遭遇しています。エラー・プロシージャを引き起こすOracleEE 11g WITH句はコンパイルされません

私はそれを試して実行するたびに、2つのエラーが表示されます。

Error report: 
ORA-06550: line 14, column 50: 
PL/SQL: ORA-00918: column ambiguously defined 
ORA-06550: line 12, column 7: 
PL/SQL: SQL Statement ignored 
ORA-06550: line 29, column 3: 
PLS-00306: wrong number or types of arguments in call to 'FIND_HIGH_AVG' 
ORA-06550: line 29, column 3: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

手順のコードは以下のとおりです。

DECLARE 
    myTerm courses.term%type; 
    myLine courses.lineno%type; 

procedure find_high_avg (term IN courses.term%type, 
         line IN courses.lineno%type, 
         s_fname OUT students.fname%type, 
         s_lname OUT students.lname%type, 
         s_sid OUT students.side%type, 
         s_avg OUT number) is 
    begin 
     WITH grades as (select * from components co --line 12 here 
      join scores sc on co.term = sc.term and co.lineno = sc.lineno and CO.COMPNAME = SC.COMPNAME 
      where sc.lineno = line and sc.term = term) --line 14 here 
     select * 
     into s_fname, s_lname, s_sid, s_avg 
     from (
      select s.fname, s.lname, s.sid, round(sum(points/maxpoints * weight),0) as AV 
      from grades, students 
      join students s on grades.sid = s.sid 
      group by s.sid, s.fname, s.lname 
      order by AV) 
     where rownum = 1; 
    end; 

BEGIN 
    myTerm:='F12'; 
    myLine:='1031'; 
    find_high_avg(myTerm, myLine); --line 29 here 
END; 

答えて

4

10行目のエラーは、ストアドプロシージャのパラメータに長さがないために発生します。手続きの宣言は、あなたのプロシージャにパラメータがあなたのテーブルの列と同じ名前を持っているので、14行でエラーの可能性がある

procedure find_high_avg (term IN courses.term%type, 
         line IN courses.lineno%type, 
         s_fname OUT students.fname%type, 
         s_lname OUT students.lname%type, 
         s_sid OUT students.side%type, 
         average OUT number) 
is 

のようなものでなければなりません。 SQL文のスコープ解決ルールでは、列名がローカルPL/SQL変数よりも優先されます。あなたは

sc.term = term 

のようなものをコーディングするときにOracleは、1つの表の列を使用して修飾されていないTERMを解決しようとします。どちらの表にもTERMという名前の列があると、あいまいな列参照が生成されます.Oracleでは、どちらの表を使用するかわかりません。もちろん、現実にはどちらのテーブルからでもカラムを使用しないようにするには、パラメータを使用する必要があります。この問題に対する最も一般的なアプローチは、パラメータ名に接頭辞を付けて、列名と衝突しないようにすることです。何かのように

procedure find_high_avg (p_term IN courses.term%type, 
         p_line IN courses.lineno%type, 
         s_fname OUT students.fname%type, 
         s_lname OUT students.lname%type, 
         s_sid OUT students.side%type, 
         p_average OUT number) 
is 

この手順では、6つのパラメータ、2 INと4 OUTが必要なため、29行目のエラーが発生します。したがって、それを呼び出すには、6つのパラメータを使用する必要があります。

DECLARE 
    myTerm courses.term%type; 
    myLine courses.lineno%type; 

    l_fname students.fname%type; 
    l_lname students.lname%type; 
    l_sid students.side%type; 
    l_avg number; 
BEGIN 
    myTerm:='F12'; 
    myLine:='1031'; 
    find_high_avg(myTerm, myLine,l_fname,l_lname, l_sid, l_avg); 
END; 
+0

私はその変更を行いましたが、私はコンパイラがまだ問題に遭遇しています。これを反映するように主な質問が更新されました。 – tyh

+0

@timyh - もう少しの問題で私の答えを更新しました。 –

+0

きれいに働いた詳細な答えをありがとうございました。これがどのように機能するかをもっとよく理解しています。 – tyh

0

ような何かが私はそれは、SELECT文の後end find_high_avg;の代わりend;されるべきだと思います。

+0

これまでと同じ問題を試しましたが、 – tyh

関連する問題