PL/SQL语言简介:
持续更新中....
PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对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(10) default '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更快