--demo1
create or replace procedure proc_query_emp
( p_empno emp.empno%type)
is
 v_emp
emp%rowtype;
begin
 select *
into v_emp
 from emp
where empno = p_empno;
 
 dbms_output.put_line(v_emp.empno);
 dbms_output.put_line(v_emp.ename);
 dbms_output.put_line(v_emp.sal);
end;
--demo2
create or replace procedure proc_i_dept
(p_deptno dept.deptno%type,
 p_dname
dept.dname%type,
 p_loc
dept.loc%type
)
is
begin
 insert into
dept(deptno,dname,loc)
 values(p_deptno,p_dname,p_loc);
 commit;
end;
--demo3
create or replace procedure proc_test_par
( p_i in varchar2,
 p_j out
varchar2,
 p_m in out
varchar2 
)
is
begin
 p_j := '2';
 dbms_output.put_line(p_i);
 dbms_output.put_line(p_j);
  dbms_output.put_line(p_m);
end;
--demo4
--step1
create table pos_info
( pid char(3),
 pnum number
)
insert into pos_info values('001',0);
insert into pos_info values('002',0);
create table sales
( sid char(16),
 sdate date
)
--step2
create or replace procedure proc_i_sales
(p_pid char)
is
 v_pnum
pos_info.pnum%type;
begin
 select pnum
into v_pnum
 from
pos_info where pid = p_pid;
 
 insert into
sales(sid,sdate)
 values(p_pid || to_char(sysdate,'YYYYMMDD')
              
|| lpad(v_pnum + 1,5,'0'),sysdate);
         
 update
pos_info
 set pnum =
pnum + 1
 where pid =
p_pid;
 
 commit;         
end;
--demo5
create or replace procedure proc_getnum
( p_pid in pos_info.pid%type,
 p_pnum out
pos_info.pnum%type
)
is
begin
 select pnum
into p_pnum
 from
pos_info where pid = p_pid;
end;
create or replace procedure proc_new_sales
(p_pid char)
is
 v_pnum
pos_info.pnum%type;
begin
 
 proc_getnum(p_pid,v_pnum);
 
 insert into
sales(sid,sdate)
 values(p_pid || to_char(sysdate,'YYYYMMDD')
               || lpad(v_pnum + 1,5,'0'),sysdate);
         
 update
pos_info
 set pnum =
pnum + 1
 where pid =
p_pid;
 
 commit;         
end;
--demo6
create or replace function fun_empsal
( p_empno emp.empno%type)
return varchar2
is
 v_emp
emp%rowtype;
begin
 select *
into v_emp
 from emp
where empno = p_empno;
 
 if
v_emp.sal >= 3000 then 
    return
'OK';
 else
    return
'NO';   
 end
if; 
 
end;
--demo7
--创建在dept表中插入和删除一个记录的数据包,它且有一个函数(返回插入或删除的部门名称)和两个过程。然后调用包。
CREATE OR REPLACE PACKAGE deptpack
AS
 PROCEDURE
inser(dno IN NUMBER,NAME IN VARCHAR2,location IN VARCHAR2);
 PROCEDURE
de(dno IN NUMBER);
 FUNCTION
getdname(num IN NUMBER) RETURN VARCHAR2;
END deptpack;
CREATE OR REPLACE PACKAGE BODY deptpack 
AS
 PROCEDURE
inser(dno IN NUMBER,NAME IN VARCHAR2,location IN VARCHAR2)
 AS
 BEGIN
    INSERT
INTO dept VALUES(dno,NAME,location);
   
dbms_output.put_line('1 record inserted!');
 END inser;
 PROCEDURE
de(dno IN NUMBER)
 AS
 BEGIN
    DELETE
FROM dept WHERE deptno=dno;
 END de;
 FUNCTION
getdname(num IN NUMBER)
 RETURN
VARCHAR2
 AS
    vname
VARCHAR2(10);
 BEGIN
    SELECT
dname INTO vname FROM dept WHERE deptno=num;
    RETURN
vname;
 EXCEPTION
    WHEN
no_data_found THEN
   
dbms_output.put_line('No such deptno exists!');
 END
getdname;
END deptpack;
                                                                                                       --    学海无涯
 学海无涯