oracle 저장 프로시저 기초 문장
14876 단어 Oacle 저장 프로시저
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;