pl/sql编程: 只适用于Oracle
标准sql: insert, update,delete,select 不能进行分支, 循环,变量...
Oracle在标准SQL基础上,扩展, 扩展的叫做PLSQL,
一个PL/SQL 包含一组SQL语句, 简单的理解: 类似于java的方法, 进行异常处理
跨数据库,移植不好
效率高, 推荐使用PL/SQL( 存储过程), 跨数据库,移植性不好
SQL 语句, 效率相对于PL/SQL 低, 跨数据库的移植性好
PL/SQL 分类:
1. 匿名PL/SQL 没有名字, 这个PL/SQL不会保存到数据库
2. 存储过程: 有名称, 存储过程保存到数据库, 没有返回值
3. 函数: 有名称, 存储过程保存到数据库, 有返回值
*默认关闭显示输出结果, 使用下面sql语句打开(set serveroutput on;)
匿名的PL/SQL块
/* 语法: [declare] --声明部分,声明变量,类型,游标,以及局部存储过程和函数 可选 begin --相当于java方法的左大括号, 开始 -- 执行部分, 过程,sql语句 [exception] --异常处理部分, 异常处理 可选 end; -- 相当于java方法的右大括号 ,结束 */ -- 编写一个输出helloworld的pl/sql --不使用变量,begin --输出: dbms_output.put_line('') dbms_output.put_line('hello world'); end;
变量
定义变量的语法:
变量名 数据类型 [:= 值];
注意:
- 变量的赋值符号是 :=
- 数据类型: char,varchar2 一定要写长度, char(20)
- 变量名使用: 字母,数字, 下划线,$,#
- 变量名只能使用字母开头 name name# name$ $name(错误)
- 变量名最大长度30
- 变量名不能使用关键字
- 变量声明只能在declare中声明,不能再begin中
实际返回的行数超出请求的行数: 变量只能存储一行结果, 查询返回的多行数据,使用游标
输入:& ( 变量名 := '&请输入员工部门编号';)
declare str varchar2(30) := 'hello world'; begin --输出: dbms_output.put_line('') dbms_output.put_line(str); --修改变量的值 str := 'hello PL/SQL'; dbms_output.put_line(str); end;
变量的赋值
1) := 值; 固定值
2) select 列名 into 变量名 from 表 ..... 从表查询到数据赋值给变量
-- 根据员工编号, 打印员工的姓名 --使用select into declare v_name varchar2(30); v_empno number; begin --查询表赋值 -- 输入 v_empno := '&请输入员工编号'; select ename into v_name from emp where empno = v_empno ; dbms_output.put_line('编号为'||v_empno||'的员工姓名:' || v_name); end;
变量的高级数据类型:
%type: 定义变量的数据类型与表某一列的数据类型一样
表名.列名%type;
declare v_name emp.ename%type; --v_name变量的数据类型与emp表的ename列的数据类型一样 v_empno emp.empno%type; begin --查询表赋值 -- 输入 v_empno := '&请输入员工编号'; select ename into v_name from emp where empno = v_empno ; dbms_output.put_line('编号为'||v_empno||'的员工姓名:' || v_name); end;
%rowtype 行数据类型
--根据员工编号,打印员工的所有信息 --行数据类型: 这个变量存放一行数据,类似于map集合, js中对象 --%rowtype用于定义不确定的类型的变量,%rowtype可以理解成对数据库中表的某一行记录的一个拷贝,使用方式 -- 表名%rowtype; declare v_empno emp.empno%type; v_emp emp%rowtype; begin --查询表赋值 -- 输入 v_empno := '&请输入员工编号'; select * into v_emp from emp where empno = v_empno ; --dbms_output.put_line('编号为'||v_empno||'的员工姓名:' || v_name); -- 获取行中某一列的数据, 行变量.列名 dbms_output.put_line('编号为'||v_empno||'的员工姓名:' || v_emp.ename ||',薪水:'||v_emp.sal); end;