oracle 저장 프로시저 기초 문장

   oracle       scott  triger                。
create or replace procedure lpmtest2
as 
  para1 varchar2(10);
  cursor  youbiao is  select ename from test where sal>1300;
begin
  open youbiao;
  loop
    fetch youbiao into para1;
    exit when youbiao%notfound;
    dbms_output.put_line('++:'||para1);
  end loop;
  close youbiao;
end;--       ,     。

 ======================================================================
create or replace procedure lpmtest2
as 
  cursor  youbiao is  select ename,sal,job from test where sal>1300;
  c_row youbiao%rowtype; --        c_row ,      youbiao        
begin
  open youbiao;
  loop
    fetch youbiao into c_row;
    exit when youbiao%notfound;
    dbms_output.put_line('++:'||c_row.ename||':'||c_row.sal||':'||c_row.job);
  end loop;
  close youbiao;
end;

 =========================================================================
create or replace procedure lpmtest3
as
cursor c_dept is select * from dept order by deptno;
cursor c_emp(p_dept varchar2) is select ename,sal from emp where deptno=p_dept order by ename;
r_dept c_dept%rowtype;
v_ename emp.ename%type;
v_sal   emp.sal%type;
v_totalsal emp.sal%type; --               
begin
  open c_dept;
  loop
    fetch c_dept into r_dept;
    exit when c_dept%notfound;
    dbms_output.put_line(r_dept.deptno||':'||r_dept.dname||'+++++++++++');
    v_totalsal:=0;
    open c_emp(r_dept.deptno);
    loop
      fetch c_emp into v_ename,v_sal;
      exit when c_emp%notfound;
      dbms_output.put_line('v_ename:'||v_ename||';'||'v_sal:'||v_sal);
      v_totalsal:=v_totalsal+v_sal;
     end loop;
     close c_emp;
     dbms_output.put_line('deptsaltotal:'||v_totalsal);
   end loop;
   close c_dept;
end;

 출력 효과:
10:ACCOUNTING+++++++++++
v_ename:CLARK;v_sal:2450
v_ename:KING;v_sal:5000
v_ename:MILLER;v_sal:1300
deptsaltotal:8750
20:RESEARCH+++++++++++
v_ename:ADAMS;v_sal:1100
v_ename:FORD;v_sal:3000
v_ename:JONES;v_sal:2975
v_ename:SCOTT;v_sal:3000
v_ename:SMITH;v_sal:800
deptsaltotal:10875
30:SALES+++++++++++
v_ename:ALLEN;v_sal:1600
v_ename:BLAKE;v_sal:2850
v_ename:JAMES;v_sal:950
v_ename:MARTIN;v_sal:1250
v_ename:TURNER;v_sal:1500
v_ename:WARD;v_sal:1250
deptsaltotal:9400
40:OPERATIONS+++++++++++
deptsaltotal:0

 ======================================================================
create or replace procedure lpmtest9(v_name varchar2)
is
v_num number:=1;
begin
  loop
     insert into lpm_user values(v_name,v_num);
     commit;
     exit when v_num=5;
     v_num:=v_num+1;
  end loop;
end;

 
=======================================================================
create or replace procedure lpmtest8(lpm_empno number)
is
lpm_job emp.job%type;
begin
  select job into lpm_job from emp where empno=lpm_empno; 
  if lpm_job='PRESIDENT' then
    begin
    update emp set sal=sal+500 where empno=lpm_empno;
    commit;
    end;
  elsif lpm_job='MANAGER' then  -- elsif  elseif!   e
    begin
      update emp set sal=sal+300 where empno=lpm_empno;
      commit;
    end;
  else
    begin
    update emp set sal=sal+100 where empno=lpm_empno;
    commit;
    end;
  end if;
end;

 ========================================================
create or replace procedure lpmtest15(lpmEmpId emp.empno%type)
is 
addincrement emp.sal%type;
tempsal emp.sal%type;
begin
  select sal into tempsal from emp where empno=lpmEmpId;
  if tempsal>2000 then addincrement:=50;
  elsif tempsal>1500 then addincrement:=100;
  else addincrement:=150;
  end if;
  update emp set sal=sal+addincrement where empno=lpmEmpId;
  commit;
end;

 =================================================================
 :        , STUDENTS              HISTORY  。  history         (  STUDENTS     ,     HISTORY  )。
Create or replace procedure move( stuno varchar) is
Begin
/* students    stuno      history  */
Insert into history(stu_id,name,sex,ldate) 
select stu_id,name,sex ,sysdate from students
where stu_id=stuno;
/* students    stuno     */
delete from students
where stu_id=stuno;
end; 

 ========================================================================
        ,        (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;
begi
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;

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(recommentArray 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;

 ======================================================================
1.       

/* Formatted on 2011/1/17 13:20:44 (QP5 v5.115.810.9015) */

CREATE OR REPLACE procedure proc_trade(

  v_tradeid in number,                        --  id

  v_third_ip in varchar2,                     --   ip

  v_third_time in date ,                      --       

  v_thire_state in number ,                   --     

  o_result out number,                       --   

  o_detail out varchar2                     --    

)

as

--     

  v_error varchar2(500);

begin

    --     

     o_result:=0;

     o_detail:='    ';

 

    --      

    if v_tradeid >100 then

        insert into table_name(...) values(...);

        commit;

    elsif v_tradeid < 100 and v_tradeid>50 then

        insert into table_name(...) values(...);

        commit;

    else

            goto log;

    end if;

--     ,      

<<log>>

        o_result:=1;

--    

exception

   when no_data_found

   then

      result := 2;

   when dup_val_on_index

   then

      result := 3;

   when others

   then

      result := -1;

end proc_trade;

 

                             ,       ,               。       ,      %type         (table_name.column_name%TYPE)。               。

 

 :

CREATE OR REPLACE PROCEDURE spdispsms (

   aempid      IN       otherinfo.empid%TYPE,

   amsg        IN       otherinfo.msg%TYPE,

   abillno     IN       otherinfo.billno%TYPE,

   ainfotype   IN       otherinfo.infotype%TYPE,

   aopid       IN       otherinfo.OPERATOR%TYPE,

   ainfoid     OUT      otherinfo.infoid%TYPE,

   RESULT      OUT      INTEGER

)

 

2.         

                       ,            。 

 

2.1  for ... in ... loop   

2.1.1:      

  1:

CREATE OR REPLACE PROCEDURE proc_test

AS

   CURSOR c1

   IS

      SELECT   * FROM dat_trade;

BEGIN

   FOR x IN c1

   LOOP

      DBMS_OUTPUT.put_line (x.id);

   END LOOP;

END proc_test;

 

  2:

CREATE OR REPLACE PROCEDURE proc_test

AS

BEGIN

   FOR x IN (SELECT   power_id FROM sys_power)

   LOOP

      DBMS_OUTPUT.put_line (x.power_id);

   END LOOP;

END proc_test;

 

2.1. 2:        

  1:

CREATE OR REPLACE PROCEDURE proc_test (v_num IN NUMBER)

AS

BEGIN

     for x in 1..100 loop

         dbms_output.put_line(x);

     end loop;

END proc_test;        

 

  2:          v_num.             。

CREATE OR REPLACE PROCEDURE proc_test (v_num IN NUMBER)

AS

BEGIN

   FOR x IN 1 .. v_num

   LOOP

      DBMS_OUTPUT.put_line (x);

   END LOOP;

END proc_test;        

 

 

2.2  loop   

   LOOP

      DELETE FROM orders

            WHERE senddate < TO_CHAR (ADD_MONTHS (SYSDATE, -3),

                                      'yyyy-mm-dd')

              AND ROWNUM < 1000;

 

      EXIT WHEN SQL%ROWCOUNT < 1;

      COMMIT;

   END LOOP;

 

   SQL%ROWCOUNT      。     ,      :%found,%notfound, %isopen。 

 

2.3  while   

CREATE OR REPLACE PROCEDURE proc_test (v_num IN NUMBER)

AS

   i   NUMBER := 1;

BEGIN

   WHILE i < v_num

   LOOP

      BEGIN

         i := i + 1;

         DBMS_OUTPUT.put_line (i);

      END;

   END LOOP;

END proc_test;

 

3.         

                             。

 

3.1  if ... elsif ... else ...   

CREATE OR REPLACE PROCEDURE proc_test (v_num IN NUMBER)

AS

BEGIN

   IF v_num < 10

   THEN

      DBMS_OUTPUT.put_line (v_num);

   ELSIF v_num > 10 AND v_num < 50

   THEN

      DBMS_OUTPUT.put_line (v_num - 10);

   ELSE

      DBMS_OUTPUT.put_line (v_num - 50);

   END IF;

END proc_test;

 

3.2  case ... when ... end case   

CREATE OR REPLACE PROCEDURE proc_test (v_num IN NUMBER)

AS

BEGIN

    case v_num

        when 1 then

             DBMS_OUTPUT.put_line (v_num);

        when 2 then

            DBMS_OUTPUT.put_line (v_num);

        when 3 then

            DBMS_OUTPUT.put_line (v_num);

        else null;

    end case;   

END proc_test;

 

4.   

                           。         :

 

4.1  Cursor   (        )

                     2.1.1:           。 

 

4.2  SYS_REFCURSOR   

                Oracle        ,         。 

                :SYS_REFCURSOR    OPEN        

 

4.2.1                       :

 

CREATE OR REPLACE procedure  proc_test(

checknum in number,  --        

ref_cursor out sys_refcursor  --      ,  

)

as 

begin

    open ref_cursor for select * from (select * from dat_trade where state=41 order by id) where rownum<checknum;

end proc_test;

/

 

SYS_REFCURSOR          :

(1).            %NOTFOUND(       ) 

(2).            %FOUND(      ) 

(3).            %ROWCOUNT(             )

 


CREATE OR REPLACE PROCEDURE proc_test (

checknum     IN     NUMBER, --        
ref_cursor      OUT sys_refcursor --      ,  
)
AS
t_tmp   table_name%ROWTYPE;
BEGIN
   OPEN ref_cursor FOR
      SELECT   *

        FROM   (  SELECT   *

                    FROM   table_name

                   WHERE   state = 41
                ORDER BY   id)
       WHERE   ROWNUM < checknum;
--    
   LOOP
      FETCH ref_cursor INTO   t_tmp;
      EXIT WHEN ref_cursor%NOTFOUND;
--    DBMS_OUTPUT.put_line (t_tmp.id);
      UPDATE   table_name

         SET   state = 53
       WHERE   id = t_tmp.id;
      COMMIT;
   END LOOP;

 

   CLOSE ref_cursor;
END proc_test;

좋은 웹페이지 즐겨찾기