Oracle PL/SQL SQL语句编程

匿名块

创建匿名块

–输出HelloWorld
BEGIN
dbms_output.put_line(‘HelloWorld’);
END;
/

–输出SCOTT用户的薪水
DECLARE
–定义变量
v_sal NUMBER(5);–变量名称不要和表名、列名重复
v_deptno emp.deptno%type;–该变量类型和emp表的deptno列的类型一致

BEGIN
select sal,deptno into v_sal,v_deptno from emp where ename = ‘SCOTT’;
dbms_output.put_line(‘SCOTT用户的薪水是:’ || v_sal || ‘,部门编号是:’ || v_deptno);
END;
/

–输入用户名称,输出该用户的薪水
DECLARE
–定义变量
v_sal NUMBER(5);–变量名称不要和表名、列名重复
v_deptno emp.deptno%type;–该变量类型和emp表的deptno列的类型一致
v_ename emp.ename%type;
BEGIN
select sal,deptno,ename into v_sal,v_deptno,v_ename from emp where ename = ‘&name’;
dbms_output.put_line(v_ename || ‘用户的薪水是:’ || v_sal || ‘,部门编号是:’ || v_deptno);
END;
/

匿名块只能使用一次

过程

创建过程

–统计10部门的最高薪水
CREATE OR REPLACE PROCEDURE maxSalByDepton_pro IS
v_maxSal emp.sal%type;
BEGIN
select max(sal) into v_maxSal from emp where deptno = 10;
dbms_output.put_line(‘10部门的最高薪水是:’ || v_maxSal);
END;

–统计某个部门的最高薪水
CREATE OR REPLACE PROCEDURE maxSalByDepton_pro(v_deptno number,v_maxSal out emp.sal%type) IS
BEGIN
select max(sal) into v_maxSal from emp where deptno = v_deptno;
dbms_output.put_line(v_deptno || ‘部门的最高薪水是:’ || v_maxSal);
END;

调用

调用过程
call maxSalByDepton_pro();

–匿名块/过程/函数调用:
DECLARE
v_sal emp.sal%type;
BEGIN
–赋值
–v_sal := ‘a’;
–字符串内显示单引号 (用两个单引号) ’ ” ’
maxSalByDepton_pro(20,v_sal);
dbms_output.put_line(v_sal);
END;
/
–单独调用:
call maxSalByDepton_pro(20,v_sal);

函数

创建函数

–统计某个部门的最高薪水
CREATE OR REPLACE FUNCTION maxSalByDepton_fun(v_deptno number) RETURN number IS
v_maxSal emp.sal%type;
BEGIN
select max(sal) into v_maxSal from emp where deptno = v_deptno;
dbms_output.put_line(v_deptno || ‘部门的最高薪水是:’ || v_maxSal);
return v_maxSal;
END;

调用函数

DECLARE
v_sal emp.sal%type;
BEGIN
v_sal := maxSalByDepton_fun(20);
dbms_output.put_line(v_sal);
END;
/

复合类型

创建带有复合类型的过程

–查找指定的员工编号对应的员工信息
create or replace procedure emp_pro1(v_empno number) is
–自定义一个复合类型
TYPE emp_type IS RECORD(v_empno emp.empno%type,v_ename emp.ename%type,v_sal emp.sal%type,v_job emp.job%type);
–创建复合类型的变量
v_emp_type emp_type;

begin
select empno,ename,sal,job into v_emp_type from emp;
dbms_output.put_line(v_emp_type.v_empno || ‘,’ || v_emp_type.v_ename);
end;
/

异常

创建带有异常处理和复合类型的过程

查找指定的员工编号对应的员工信息
create or replace procedure emp_pro1(v_empno number) is
–自定义一个复合类型
TYPE emp_type IS RECORD(v_empno emp.empno%type,v_ename emp.ename%type,v_sal emp.sal%type,v_job emp.job%type);
–创建复合类型的变量
v_emp_type emp_type;

begin
select empno,ename,sal,job into v_emp_type from emp where empno = v_empno;

–定义异常处理
exception
when no_data_found then
dbms_output.put_line(‘没有对应的记录’);
when too_many_rows then
dbms_output.put_line(‘只能对应一条记录’);
when others then
dbms_output.put_line(‘other’);

end;
/

分支

分页的时候
总记录数 每页显示的记录数
页数 = 总记录数/每页显示的记录数

包含分支的匿名块

DECLARE
v_count number(2);
v_perPage number := 5;
v_pages number(4,2);
BEGIN
select count(*) into v_count from emp;
v_pages := trunc(v_count/v_perPage);
if mod(v_count,v_perPage) > 0 then
v_pages := v_pages + 1;
end if;
dbms_output.put_line(‘总记录数:’ || v_count || ‘,每页显示记录数:’ || v_perPage ||’,总页数:’ || v_pages);
END;
/

游标和循环

创建包含游标和循环的过程

create or replace procedure cursor_pro(v_deptno number) is
–定义游标类型
type emp_cursor is ref cursor;
–定义游标类型的变量
v_emp_cursor emp_cursor;

v_empno emp.empno%type;
v_ename emp.ename%type;
v_job emp.job%type;

begin
–循环
loop
fetch v_emp_cursor into v_empno,v_ename,v_job;
exit when v_emp_cursor%notfound;
dbms_output.put_line(v_empno||’,’||v_ename||’,’||v_job);
end loop;
CLOSE v_emp_cursor;

end;
/

创建包

CREATE OR REPLACE PACKAGE 包名 IS
procedure t_pro;–包内的过程
function t_fun RETURN NUMBER;–包内的函数
END;
/

创建包体

CREATE OR REPLACE PACKAGE BODY 包名 is
procedure t_pro is
begin
dbms_output.put_line(‘procedure’);
end;
function t_fun RETURN NUMBER is
begin
dbms_output.put_line(‘function’);
end;
end;
/

调用包

call 包名.t_pro();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值