2017-12-31 123 views
0

안녕하세요 저는 pl/sql에서 newb입니다.이 템플릿은 교육용으로 만 제공됩니다. 직원들이 만든라는 이름의 테이블을 포함 파견 schama .and ZONE라는 테이블을 포함 PRF 스키마.oracle : PL/SQL 프로 시저를 사용하여 다른 스키마의 테이블을 채우십시오.

디스패치 : 직원들이 만든 (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; 

단위는 도시이다, 각 지역은 많은 단위를 포함한다. 간단한 방법으로 prob 프로 시저가 데이터를 삽입하지 않는 경우 올바른 방법입니다. (나의 영어에 관해 유감스럽게 생각한다 :)).

+0

변경 사항을 적용 했습니까? –

+0

나는 늦었다. 나는 "e"가 employes 테이블의 대상이라고 생각한다. – khaledz

답변

1

PRF로 연결되어 있고 DISPATCHING 사용자에게 속한 값을 가져 오는 것 같습니다. 그렇게하기 위해 파견 부여하는 (적어도) PRF하는 직원 테이블에 SELECT :

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

절차를 (당신은 PL/SQL을 실행하고 같은) 루프에 대한 커서를 이용해야 그대로 명시 적으로 선언 된 커서를 사용하는 루프 (값을 저장할 필요가있는 변수와 선언 할 필요가 없으므로)보다 루프를 종료 할 때 걱정할 필요가 없습니다. - 닫아. 커서 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; 
/

필자는 오타 (typo)가없는 한 그렇게해야합니다.

마지막으로 제안 사항은 다음과 같습니다. 코드의 형식을 올바르게 지정하십시오. 귀하가 올린 글은 들여 쓰기가 어려우며, 들여 쓰기가 없으며, 너무 긴 줄 (깨지십시오!), 몇 줄 밖에 없습니다. 수천 줄의 코드를 가지고있을 때 어떤 일이 벌어 지는지 상상해보십시오 - 누가 그것을 디버그 할 것으로 예상합니까? 그 코드를 다 마친 지 1-2 개월 만에, 당신이 한 일과 왜 (왜 그렇게 말했는지) 잊어 버리고, 형식이 지정되지 않았다면 두통을 겪을 것입니다. 오늘날의 GUI 도구는 자동 서식을 제공하므로 사용하십시오. 그렇지 않은 경우 무료 온라인 형식 지정자 (예 : Instant SQL Formatter)가 있습니다.

+0

각하, 나는 통제 문 사용에 대해 많은 것을 배웁니다. – khaledz

+0

"유형 생성"으로 작성된 "e"입니까? – khaledz

+0

이 경우'e'는'EMPLOYEES'에 대한 "별칭"입니다. 이 질의 안에는 보통'EMPLOYEES'를 사용하는 곳이면 어디서든 사용할 수 있습니다. 그래서 당신이 볼 수 있듯이 질의를 작성한 사람은'SELECT EMPLOYEES.DESIGN_ZONE' 대신'SELECT e.DESIGN_ZONE'을 썼습니다. 'EMPLOYEES'를 참조하는 간단한 방법 일뿐입니다. –