Oracle 스토리지 프로세스 요약(컨텐트 오프로드)

6158 단어
1. 저장 프로세스 생성
create or replace procedure test(var_name_1 in type,var_name_2 out type) as
--    (        )
begin
--        
end test;

-- E.g:           

create or replace procedure test(workDate in Date) is
begin
dbms_output.putline('The input date is:'||to_date(workDate,'yyyy-mm-dd'));
end test;

2. 변수 할당
변수 이름: = 값;
create or replace procedure test(workDate in Date) is
x number(4,2);
begin
x := 1; 
end test;

3. 판단문:
if 비교 then begin end;end if;
eg.
create or replace procedure test(x in number) is
  begin
       if x >0 then
           begin
           x := 0 - x;
           end; 
        end if;

         if x = 0 then 
         begin
            x: = 1;
         end; 
        end if; 
 end test;

4. For 루프
For ... in ... LOOP 
--     
end LOOP; 

(1) 루프 사이클
create or replace procedure test() as
Cursor cursor is select name from student; name varchar(20);
begin
   for name in cursor LOOP 
     begin
       dbms_output.putline(name); 
     end; 
   end LOOP;
end test;

(2) 순환 반복 그룹
create or replace procedure test(varArray in myPackage.TestArray) as
--(    varArray          ,       6)
i number;
begin 
i := 1; --             1   , java、C、C++     。   Oracle           ,        
-- (Table),               ,                        

for i in 1..varArray.count LOOP 
   begin
    dbms_output.putline('The No.'|| i || 'record in varArray is:'||varArray(i)); 
   end LOOP; 
end test;

5.While 주기
while 조건문 LOOP
begin
end;
end LOOP;
E.g
create or replace procedure test(i in number) as
begin
  while i < 10 LOOP 
    begin 
	i:= i + 1;
    end; 
  end LOOP;
end test;

6, 배열
먼저 하나의 개념을 명확히 한다. Oracle에는 수조의 개념이 없었는데 수조는 사실 하나의 표(Table)이고 모든 수조 요소는 표의 기록이다.
배열을 사용할 때 Oracle에서 정의한 배열 유형을 사용하거나 필요에 따라 배열 유형을 정의할 수 있습니다.
(1) Oracle 자체 배열 유형 사용
x array; --            

e.g:

create or replace procedure test(y out array) is
x array; 
begin
	x := new array();
	y := x;
end test;

 
(2) 사용자 정의 배열 유형(사용자 정의 데이터 유형은 쉽게 관리할 수 있도록 Package를 만드는 것이 좋습니다)
E.g(사용자 정의 사용 제목 4.2 참조)
 create or replace package myPackage is 
-- Public type declarations type info is record( name varchar(20), y number);
type TestArray is table of info index by binary_integer; --여기에 TestArray의 유형 데이터를 설명했는데 사실은 Info 데이터 형식을 저장하는 Table일 뿐이고 TestArray는 표입니다. 두 개의 필드가 있는데 하나는
name, 하나는 y입니다.여기서 주의해야 할 것은 Index by binaryintegerTable의 색인 항목을 작성하거나 쓰지 않고 type TestArray is로 작성할 수 있습니다.
table of info, 쓰지 않으면 그룹을 사용할 때 초기화합니다: varray myPackage.TestArray; varArray := new myPackage.TestArray();
end TestArray;
7. 커서의 사용은 Oracle에서 커서를 사용하는 데 매우 유용하며 임시 테이블의 검색 결과를 훑어보는 데 사용된다.관련 방법과 속성도 많고,
현재 자주 사용하는 용법만 하나 둘 소개한다.
(1) Cursor형 커서 (매개변수 전송에는 사용할 수 없음)
create or replace procedure test() is 
cusor_1 Cursor is select std_name from student where ...; --Cursor     1 cursor_2 Cursor;

begin
	select class_name into cursor_2 from class where ...; --Cursor     2
                            --   For x in cursor LOOP .... end LOOP;     Cursor   
end test;

 
(2)SYS_REFCURSOR형 커서, 이 커서는 Oracle이 미리 정의한 커서로 매개 변수를 전달할 수 있다
create or replace procedure test(rsCursor out SYS_REFCURSOR) is
cursor SYS_REFCURSOR; name varhcar(20);
begin
   OPEN cursor FOR select name from student where ... --SYS_REFCURSOR    OPEN        
LOOP
  fetch cursor into name --SYS_REFCURSOR    fetch into       exit when cursor%NOTFOUND; --SYS_REFCURSOR          : ---%NOTFOUND(       ) %FOUND(      ) ---%ROWCOUNT(             )
  dbms_output.putline(name); 
end LOOP;
  rsCursor := cursor; 
end test;

 
다음은 앞서 설명한 스토리지 프로세스의 사용법을 적용하기 위한 간단한 예입니다.
현재 두 장의 표가 존재한다고 가정하면 한 장은 학생성적표(studnet), 한 장은 stdId, math,article,language,music,sport,total,average,step 한 장은 학생과외성적표(out school), 한 장은 stdId,parctice,comment
저장 프로세스를 통해 각 학생의 총 성적과 평균 성적을 자동으로 계산하는 동시에 학생이 과외 과정에서 A로 평가되면 총 성적에 20점을 더한다.
create or replace procedure autocomputer(step in number) is
rsCursor SYS_REFCURSOR;
commentArray myPackage.myArray;
math number;
article number;
language number;
music number;
sport number;
total number;
average number;
stdId varchar(30);
record myPackage.stdInfo;
i number;
begin
	i := 1;
	get_comment(commentArray); --    get_comment()               
	OPEN rsCursor for select stdId,math,article,language,music,sport from student t where t.step = step;
	LOOP 
	    fetch rsCursor into stdId,math,article,language,music,sport; exit when rsCursor%NOTFOUND;
		total := math + article + language + music + sport;
		for i in 1..commentArray.count LOOP 
			record := commentArray(i); 
			if stdId = record.stdId then 
			begin 
				if record.comment = 'A' then 
				begin 
					total := total + 20; 
					go to next; --  go to  for   
				end; 
				end if; 
			end; 
			end if; 
	end LOOP;
<<continue>> average := total / 5;
	update student t set t.total=total and t.average = average where t.stdId = stdId; 
	end LOOP;
end;
end autocomputer;

--             

create or replace procedure get_comment(commentArray out myPackage.myArray) is
rs SYS_REFCURSOR; 
record myPackage.stdInfo; 
stdId varchar(30); 
comment varchar(1); 
i number;
begin
	open rs for select stdId,comment from out_school
	i := 1;
	LOOP
	fetch rs into stdId,comment; exit when rs%NOTFOUND; 
	record.stdId := stdId;
	record.comment := comment; 
	recommentArray(i) := record; 
	i:=i + 1; 
	end LOOP;
end get_comment;

--      myArray 

create or replace package myPackage is begin
type stdInfo is record(stdId varchar(30),comment varchar(1));
type myArray is table of stdInfo index by binary_integer;
end myPackage;
주의: 저장 프로세스나 패키지가 생성된 후commit이 필요합니다. 그렇지 않으면 저장 프로세스를 호출할 때'식별자를 찾지 못하거나 저장 프로세스 or 함수가 아니다'call procedurename

좋은 웹페이지 즐겨찾기