2016-10-12 18 views
0

ERROR at line 4: ORA-06550: line 4, column 5: PLS-00320: the declaration of the type of this expression is incomplete or malformed ORA-06550: line 2, column 1: PL/SQL: Item ignored ORA-06550: line 4, column 1: PLS-00320: the declaration of the type of this expression is incomplete or malformed ORA-06550: line 10, column 10: PL/SQL: ORA-00904: : invalid identifier ORA-06550: line 9, column 1: PL/SQL: SQL Statement ignoredはPLSQL

declare 
type emp_detp_record is record 
( 
emp emp%rowtype, 
dept dept%rowtype 
); 
emp_dept emp_detp_record; 
begin 
select * into 
emp_dept 
from emp,dept 
where emp.deptno =dept.deptno 
and empno =7839; 
end; 
/
+0

私はそれがサポートされているとは思わない私はテストを設定し、テーブルをエイリアス化して、必要な場所にそれぞれテーブルを置くことができましたが、別のエラーが発生しました。PLS-00494:サポートされていない複数のレコードターゲットへの変換。私はそれを続けるつもりですが、これについてもっと知っている人が答えを提供してくれることを願っています。 – Bob

答えて

0

に複合レコード型の値を取るためにどのように私は、このようなシナリオを処理するために、コレクションを使用しています。これがあなたに役立つことを願っています。

declare 
cursor emp_dept_cur is 
select emp.empno,dept.deptno 
from emp,dept 
where emp.deptno =dept.deptno 
and empno =7839; 
type emp_detp_record is table of emp_dept_cur%rowtype; 
emp_dept emp_detp_record; 
begin 
open emp_dept_cur; 
loop 
fetch emp_dept_cur bulk collect into emp_dept; 
exit when emp_dept.count=0; 
null; 
end loop; 
close emp_dept_cur; 
end; 
/
+0

私はこれが受け入れられた答えであることを知っていますが、すべてのフィールドを指定することなくコンポジットレコードタイプを持つことができれば、実際にはその質問に答えません。すべてのフィールドを指定する場合は、元の質問と同じメソッドを使用できます。 – Bob

+0

@Bob - あなたは何を意味するのかはっきりしていませんが、 "select \ *"が問題だと思うならば、そうではありません。結合が計算され、データがフェッチされます。その時点では、ジョインに起因する行の「メモリー」はなく、単一の表からのものではありません。 – mathguy

+0

@Bob:このようなレコードタイプを作成すると、結果セットを提供するクエリとしてPLS-00597が発生する傾向があります。私は過去にこの問題に直面して以来、これまでコレクションを使用し始めました。 – hemalp108

1

コードに2つの問題があります...第4行目のエラーは、属性に選択した名前が原因です。行5のempからx、およびdeptからyに変更すると、宣言が機能します。

次に、プロシージャの本体で行セットからデータをフェッチします。 2つのテーブルを結合して行セットを作成するということは無関係です。最初に結合が計算され、次にそれから行を抽出し、値をempdept subrowに分割しようとします。それは不可能です。データが結合から入ってくると、それは結合であり、単一の表ではないという事実は「ブリッジの下の水」である。 empdeptのデータを別々の属性に保存する必要がある場合は、empdeptを別々に持ち込む必要があります。

1

あなたはCURSORを使用して、カーソルのROWTYPEにレコードを固定することができます

declare 
    cursor emp_dept_cur is 
    select * 
    from emp 
    join dept on emp.deptno = dept.deptno; 
    emp_dept_rec emp_dept_cur%rowtype; 
begin 
    select * into 
    emp_dept_rec 
    from emp 
    join dept on emp.deptno =dept.deptno 
    where empno = 7839; 
-- dbms_output.put_line(emp_dept_rec.deptno); -- raises PLS-00302: component 'deptno' must be declared 
end; 

いくつかの注意:

  • で複数のテーブル(JOINのための古いOracle構文を使用しないでくださいFROM句)。代わりにANSI JOINを使用してください。
  • これにより、重複する列名に問題が発生します。あなたの例では、deptnoという名前の2つの列があります.1つはempから、もう1つは部門からです。これにより、アクセスしようとするとすぐにエラーが発生します(コードのコメント行を参照してください)
+0

私は、あなたがUSINGキーワードに参加することで列名の問題を解決できると信じています。私は古いJOIN構文に完全に同意しますが、なぜ一部の人々がまだそれを使用しているのか理解しています私の会社は、私が変更しようとしているOracleの構文を使用すると主張しますが、使用しない理由のリストを含むOracleの公式文書を提出した後でも、その戦いを失いました。 – Bob