2017-12-31 37 views
0

こんにちは私はpl/sqlでnewbです:)これは教育的なものです。 Employesという名前のテーブルを含む派遣 schama .AND ZONEという名前のテーブルを含めるPRFスキーマ。oracle:PL/SQLプロシージャを使用して別のスキーマから表を移入する

派遣:Employes(num_emp番号、名前NVARCHAR2、design_unitのVARCHAR2、design_zoneのVARCHAR2)PRF:ZONE(num_zone番号、design_zoneのVARCHAR2は、数number_of_units)。 問題は、EmployesテーブルからZONEテーブルを取り込むpl/sqlプロシージャを作成しています。これは私の手続きです:

create or replace procedure zoneD as 

cursor cur is select design_zone,design_unit from dispatching.employes group by design_zone,design_unit; 
varzone cur%rowtype; 



begin 

open cur; 

fetch cur into varzone;loop 
exit when cur%notfound; 

insert into zone(num_zone,design_zone,nbr_of_unit) values (num_zone.nextval,varzone.design_zone,0); 

update zone set nbr_of_unit =(select count(design_unit) from dispatching.employes); 

end loop; 


close cur; 


end zoneD; 

ユニットは町です、各ゾーンには多くのユニットが含まれています。簡単な方法では、プロシージャは、それが正しい方法であるかどうかわからないデータを挿入しません。 (私の英語については申し訳ありません:))。

+0

変更をコミットしましたか? –

+0

私は遅かった、私は "e"はemployesテーブルのオブジェクトだと思いますか? – khaledz

答えて

1

あなたはPRFとして接続されており、DISPATCHINGユーザーに属する値を取得したいようです。そのためには、ディスパッチが許可している(少なくとも)PRFするために、従業員テーブルにSELECT:

-- connect as DISPATCHING 
grant select on employees to prf; 

手順を(あなたがPL/SQLを練習していると)カーソルFORループを使用する必要があり、それがあるとして明示的に宣言されたカーソルを使用するループ(値を格納する必要がある変数だけでなく宣言する必要もない)よりも保守がはるかに容易で、ループを終了するときに心配がありません。 - それを閉じます。カーソルFORループはあなたのためにすべてのことを行います(明示カーソルを宣言しているときと同じSELECT文を書くことを除いてOK)。

-- connect as PRF 
create or replace procedure zoned as 
begin 
    -- cursor FOR loop - you can select both DESIGN_ZONE and count number of 
    -- units so that you wouldn't have to update that value separately 
    for cur_r in (select e.design_zone, count(*) number_of_units 
       from dispatching.employees e -- naming the owner which granted SELECT on its table to PRF user 
       group by e.design_zone 
       ) 
    loop 
    insert into zone (num_zone, design_zone, number_of_units) 
     values (num_zone.nextval, cur_r.design_zone, cur_r.number_of_units); 
    end loop; 
end; 
/

私はタイプミスをしていない限り、それを行う必要があります。

最後に、もし私が:あなたのコードを適切にフォーマットしてください。あなたが投稿したものは、読みにくい混乱です。字下げや長すぎる行(壊れません!)、数行しかありません。何千ものコード行があるときに何が起こるか想像してください。誰がそれをデバッグすると思いますか?あなたがそのコードを読んだ後、ちょうど1〜2ヶ月後には、あなたが何をしたのか、なぜそれをコメントするのか、それともフォーマットされていないのかを忘れるでしょう。今日のGUIツールは自動フォーマットを提供していますので、それを使用してください。それ以外の場合は、Instant SQL Formatterのような無料のオンラインフォーマッタがあります。

+0

私はあなたからたくさんのことを学んでくれてありがとう、特に制御文の使用については特に感謝しています。 – khaledz

+0

"タイプを作成"で作成された "e"ですか? – khaledz

+0

この場合、 'e'は' EMPLOYEES'の "エイリアス"と呼ばれています。このクエリの内部では、通常 'EMPLOYEES'を使用する場所であればどこでも使用できます。つまり、表示されているように、SELECT EMPLOYEES.DESIGN_ZONEの代わりにSELECT e.DESIGN_ZONEを記述しています。 'EMPLOYEES'を参照するのは簡単な方法です。 –

関連する問題