PL/SQL入门

PL/SQL语言简介

持续更新中....

PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQLOracle数据库SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。

增加对oracle的理解;

它和很相似,学会了它有利于学习。

PL/SQL基础语法:

一个pl/sql程序分为三部分declare(定义);begin(开始)end(结束)。如以下代码段:

----------------------------------------------------

declare 

  a number default 1;--申明一个number型变量(a)并把它赋值为1

  --还可以这样赋值: a number:=1

  var_col emp.ename%type;--%TYPE变量来声明单行单列变量.

  var_const constant varchar2(10default 'ccc';--常量

 

begin 

  a:=2;

  select ename into var_col from emp where empno=7788;

  dbms_output.put_line('a的值:'||a||',var_col的值:'||var_col||',var_const:'||var_const);

end;

上面的程序定义了三个变量,并把它们赋值输出。当然PL\SQL也有顺序、循环和分支(选择)三大结构。篇幅有限不一一介绍了,想了解更多PL/SQL基础语法的请看这文档。

下面我们通过一些简单的实例来一起学习PL/SQL(*^__^*) 嘻嘻……两天前我还不知道PL/SQL是啥东西。我们一起交流学习吧。

实例练习:

/*增加指定部门员工的工资10%。

  然后打印出所有的最新工资,

以及所有工资之和

*/

declare

  e_sal number;

d_id number;

begin

  d_id:=&depnumber;

select count(*) into c from emp

  where deptno=d_id;--记录数

  for  i in 1..c Loop

select empno,sal into e_id,e_sal from

   (select rownum num,t.* from emp t)

 where num=i;

dbms_output.put_line(e_id||'更新后的薪水是'||)

update emp set sal sal =e_sal where empno=e_id;

 s_sum=e_sal+s_sum;

end loop;

 update emp set sal=sal*1.1 where

/*

 根据员工编号打印:ename(员工姓名)、dname(部门名称)

   要求分别使用三种方法

       a、rowtype (提示:视图%rowtype)

       b、record

       c、type

*/

--c、type

DECLARE 

  a emp.ename%TYPE;  --员工名字

  b dept.dname%TYPE--部门名称

BEGIN

  SELECT ename,dname INTO a,b 

     FROM emp e,dept d

      WHERE e.deptno=d.deptno

         AND e.empno=&uuu;

  --打印       

  dbms_output.put_line('员工名字:'||a||',部门名称:'||b);

END;

-- a、rowtype (提示:视图%rowtype)

CREATE VIEW v_emp_dept 

   AS

  SELECT ename,dname 

   FROM emp t1,dept t2

    WHERE t1.deptno=t2.deptno

  WITH READ ONLY--只读视图

 

DECLARE

  t v_emp_dept%ROWTYPE;

BEGIN

  SELECT ename,dname INTO t 

     FROM emp e,dept d

      WHERE e.deptno=d.deptno

         AND e.empno=&uuu;

  

  dbms_output.put_line('员工名字:'||t.ename||',部门名称:'||t.dname);

END;

--b、record

DECLARE

--数据类型ty

 TYPE ty IS RECORD 

 (

   c1 emp.ename%TYPE,

   c2 dept.dname%TYPE

 );

 var ty;

BEGIN

  SELECT ename,dname INTO var 

     FROM emp e,dept d

      WHERE e.deptno=d.deptno

         AND e.empno=&uuu;

  

  dbms_output.put_line('员工名字:'||var.c1||',部门名称:'||var.c2);

END;

/*

   添加员工,工号使用序列seq_emp。

   然后打印该员工的最新工号。

*/

CREATE SEQUENCE seq_emp;

DECLARE

  e_id NUMBER;

BEGIN

  SELECT seq_emp.NEXTVAL INTO e_id FROM dual;

  INSERT INTO emp(empno) VALUES(e_id);

  dbms_output.put_line('最新工号是:'||e_id);

  COMMIT;

END;

SELECT * FROM emp;

/*

 根据工号查询员工姓名,工作和工资。

    如果员工不存在,则提示之。

*/

--预定义异常 no_data_found

DECLARE

  e_name emp.ename%TYPE;

  e_job emp.job%TYPE;

  e_sal emp.sal%TYPE;

BEGIN

  SELECT ename,job,sal INTO 

        e_name,e_job,e_sal

    FROM emp 

      WHERE empno=&i;

  dbms_output.put_line('员工的名字是:'||e_name||'薪水是:'||e_sal);

EXCEPTION 

  WHEN no_data_found THEN

    raise_application_error(-20222,'该员工不存在');

END;

/*

添加100000员工以下信息:empno,ename,sal,job,hiredate

   要求:使用两种方法,并对比两种方法的执行效率。

   a、静态sql,使用拼接字符串

   b、动态sql,使用绑定变量

   说明:原emp表的empno长度为4,

   所以需要使用 'alter table 表名 modify 字段 数据类型' 来扩大字段。

*/

 DROP TABLE emp2;

 CREATE TABLE emp2 

  AS SELECT * FROM emp;

 SELECT COUNT(*) FROM emp2;

 ALTER TABLE emp2 MODIFY empno NUMBER(10);

TRUNCATE TABLE emp2;--清空数据

--静态的 sql

BEGIN

  FOR i IN 9000..109000 LOOP

     INSERT INTO emp2(empno,ename,sal,job,hiredate)

       VALUES(i,i,2000,'CLERK',SYSDATE); 

  END LOOP;

  COMMIT;

END;

--动态sql

BEGIN

  FOR i IN 9000..109000 LOOP

  EXECUTE IMMEDIATE  

    'INSERT INTO emp2(empno,ename,sal,job,hiredate)

     VALUES(:1,:2,:3,:4,:5)' 

   USING i,i,'2000','CLERK',SYSDATE;

  END LOOP;

  COMMIT;

END;

---静态的跟快,类似于java中的new更快

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值