概述
PLSQL 是Oracle公司在SQL基础上进行扩展而成的一种过程语言。PLSQL提供了典型的高级语言特性,包括封装,例外处理机制,信息隐藏,面向对象等;并把最新的编程思想带到了数据库服务器和工具集中。
优势:
与Java, C#相比 ,PLSQL的优势是:SQL语言可以直接写到PLSQL的“块”中或者是PLSQL的过程、函数中。没有必要向java那样先创建Statement对象来执行SQL; 这使得PLSQL成为很强大的事务处理语言,即:使用SQL来处理数据,使用控制结构来处理业务逻辑。
使用分号作为一句SQL 或者PLSQL语句的结束;
块结构关键字(DECLARE, BEGIN,EXCEPTION 后面不跟分号;
END后面需带分号;
存储过程和函数的区别:有无返回值!!!
PLSQL的变量类型:
PLSQL的变量声明:
语法:
identifier [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];
举例:
```
DECLARE
v_hiredate DATE;
v_deptno NUMBER(2) NOT NULL := 10;
v_location VARCHAR2(13) := 'Atlanta';
c_comm CONSTANT NUMBER := 1400;
```
1、变量命名建议遵循通用规则,比如v_name 表示一个变量,c_name表示一个常量;
2、一般建议每一行声明一个变量,这样程序的可读性比较好;
3、如果声明了变量,但未进行初始化,则在没有赋值之前该变量的值为NULL; 一个好的编程习惯是对所有声明的变量进行初始化赋值。
4、在同一个块中,避免命名与数据库表中的字段名相同的变量;
PLSQL特有的%TYPE属性来声明与XX类型一致的变量类型:
...
v_name employees.last_name%TYPE; v_min_balance v_balance%TYPE := 10;
可绑定变量
DBMS_OUTPUT.PUT_LINE()介绍:
例子中,我们使用DBMS_OUTPUT.PUT_LINE () 输出变量v_sal的值;
DECLARE
v_sal NUMBER(9,2) := &p_annual_sal;
BEGIN
v_sal := v_sal/12;
DBMS_OUTPUT.PUT_LINE ('The monthly salary is ' ||
TO_CHAR(v_sal));
END;
‘ & ’ 注意,弹出输入框,测试好用,注意使用
注释语句:
1、多行注释类似于java 或者 C , 使用 /* 和 */
2、单行注释是在语句后面使用 –
SQL函数在PLSQL的过程语句中的使用:
嵌套中,里层访问外层:使用outer.birthdate
例子:
<
DECLARE birthdate DATE;
BEGIN DECLARE birthdate DATE;
BEGIN ...
outer.birthdate := TO_DATE('03-AUG-1976', 'DD-MON-YYYY');
END;
....
END;
SELECT INTO 语句: 用于把从数据库查询出内容存入变量
SET SERVEROUTPUT ON
DECLARE
v_sum_sal NUMBER(10,2);
v_deptno NUMBER NOT NULL := 60;
BEGIN
SELECT SUM(salary) -- group function
INTO v_sum_sal
FROM employees
WHERE department_id = v_deptno;
DBMS_OUTPUT.PUT_LINE ('The sum salary is ' ||
TO_CHAR(v_sum_sal));
END;
/
控制主要包括判断和循环
需要注意的是对NULL的判断处理:
循环语句:
基本循环:
LOOP
statement1;
. . .
EXIT [WHEN condition];
END LOOP;
for循环
WHILE condition LOOP
statement1;
statement2;
. . .
END LOOP;
while循环:
FOR counter IN [REVERSE]
lower_bound..upper_bound LOOP
statement1;
statement2;
. . .
END LOOP;
PLSQL中常用的自定义类型就两种:
记录类型、PLSQL内存表类型(根据表中的数据字段的简单和复杂程度又可分别实现类似于简单数组和记录数组的功能)
%ROWTYPE属性
在PLSQL中 %ROWTYPE 表示某张表的记录类型 或者是用户指定以的记录类型,使用此
属性可以很方便的定义一个变量,其类型与某张表的记录或者自定义的记录类型保持一致。极大的方便了Select * into ….的语句使用。
举例;
DECLARE
emp_rec employees%ROWTYPE;
BEGIN
SELECT * INTO emp_rec
FROM employees
WHERE employee_id = &employee_number;
INSERT INTO retired_emps(empno, ename, job, mgr, hiredate,
leavedate, sal, comm, deptno)
VALUES (emp_rec.employee_id, emp_rec.last_name, emp_rec.job_id,
emp_rec.manager_id, emp_rec.hire_date, SYSDATE, emp_rec.salary,
emp_rec.commission_pct, emp_rec.department_id);
COMMIT;
END;