玩转oracle学习第六天
1.上节回想
2.PL/SQL的介绍
3.PL/SQL的基础
理解oracle的pl/sql概念
掌握PL/SQL编程技术(包含编写过程,函数,触发器。包。。。
)
PL/SQL是什么?
PL/SQL(procedural language/sql)是oracle在标准的sql语言的扩展,PL/SQL不仅同意
嵌入sql语言,
数据库:编写存储过程。函数,触发器。使用的是PL/SQL语言。PL/SQL简化了复杂度
添加程序的模块化,减小网络的传输的开销,提高安全性,提高程序的执行效率
1.过程,函数,触发器是PL/SQL编写的
2.过程,函数。触发器是在oracle中
3.PL/SQL是很强大的数据库过程语言
4.过程,函数能够在java程序中调用
传统的操作数据库的方法是:
java程序sql-》sql(数据库编译)
程序要有灵魂,一个程序猿的成长是须要过程的,
PL/SQL不好的地方:
1.移植性不好,仅仅能使用单个数据库,不能用于其它数据库
PL/SQL 用什么编写PL/SQL
PL/SQL开发工具
PL/SQL是oracle公司提供的一个工具
编写存储过程。向当中插入记录
1.创建一个简单的表
create table mytest(name varchar2(20),passwd varchar2(30));
2.创建存储过程
create or replace procedure sp_pro1 is
begin
--运行部分
insert into mytest values('何世阳','m123')
end;
/
replace:表示有就会替换
怎样查看错误信息:
show error;
怎样调用存储过程?两种方法
(1)exec sp_pro1(參数1。參数2,。。。);
(2)call sp_pro1(參数1,參数2,。
。
。);
使用PL/SQL developer工具开发PL/SQL的存储过程
create or replace procedure sp_pro2 is
begin
delete from mytest where name='何世阳';
end;
存储过程如今还没有一个标准,各个数据库有自己的存储过程编写规则
PL/SQL编程使用变量和逻辑控制语句,从而编写非常实用的功能模块
简单分类:
|--过程
|--函数
块(编程)
|--触发器
|--包
编写规范:
(1)凝视
单行凝视 --
select * from emp where empno=7788;--取得员工信息
多行凝视
/*...*/来划分
(2)表示符号的命名规范
1)当定义变量,建议用v_作为前缀
2)常量。c_作为前缀
3)游标,_cursor作为后缀
4)例外。e_作为前缀。比如e_error
块的介绍:
块(block)是PL/SQL的基本程序单元,编写PL/SQL程序实际就是编写PL/SQL块
块的结构图:
PL/SQL块由三部分构成:定义部分,运行部分。例外处理部分
例如以下所看到的:
declear
/*定义部分-----定义常量,变量,游标,例外。复杂数据类型*/
begin
/*运行部分-----要运行的PL/SQL语句和sql语句*/
exception
/*例外处理部分---处理执行的各种错误*/
end;
特别说明:
定义部分是从delete開始的
该部分是可选的
运行部分是从begin開始的
该部分是必须的
例外处理部分是从exception開始的
该部分是可选的
java程序结果
public static void main(String[] args)
{
int a = 1;
try
{
a++。
}
catch(Exception e)
{
}
}
最简单的块:
set serveroutput on --打开输出过程
begin
dbms_output.put_line('hello world');
end;
以上是输出‘hello world’的块,说明例如以下:
dbms_output 是oracle所提供的包(类似java的开发包),该包包括一些过程,
put_line就是dbms_output包的一个过程
declear
v_ename varchar2(5);--定义字符串变量
v_sal number(7.2);
begin
select ename into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line('雇员名'||v_ename);
exception
when no_data_found then
dbms_output.put_line('朋友,你的编号输入有误!');
end;
/
&表示要接受控制台输入的參数
定义部分,运行部分和例外处理部分
oracle事先提前定义了一些例外。比如no_data_found
过程:
过程用于运行特定的操作,当建立过程时。既能够指定输入參数,也能够指定输出參数。通过在过程中
使用输入參数。能够将数据传递到运行部分。
通过使用输出參数。能够将运行部分的数据传递到应用环境。在sqlplus中能够使用create procedure命令来建立过程
实比例如以下:
(1)编写一个过程,能够输入雇员名。新工资,可改动雇员的工资
(2)调用过程有两种方法:
(3)在java程序中调用一个存储过程
create procedure sp_pro3(spName varchar2,newSal number) is
--定义变量部分
begin
--运行部分。依据username去改动工资
update emp set sal=newSal where ename = spName;
end;
/
调用以上存储过程:
exec sp_pro3('scott',4789);
java程序中调用一个存储过程
//编写一个java application程序測试oracle存储过程的调用
import java.sql.*;
1.载入驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
2.得到连接
Connection ct = DriverManager.getConnection("");
3.创建CallableStatement
CallableStatement cs = 。
。。
?
怎样使用过程返回值??
函数:函数和过程本身是一家。函数用于返回特定的数据,当建立函数时。在函数头部必须包括return语句
函数案例:
案例:输入雇员姓名,返回该雇员的年薪
create function sp_fun2(spName carchar2) return
number is yearSal number(7,2);
begin
--运行部分
select sal*12+nvl(comm,0)*12 into yearSal from emp where ename=spName;
return yearSal;
end;
调用
1)在sqlpls中进行函数调用
tome number
call sp_fun2('scott') into:abc;
print abc
2)相同我们能够在java程序中调用该函数
select annual_income('SCOTT') from dual;
能够通过rs.getInt(1)得到返回的结果
触发器:触发器是指隐含的运行的存储过程。
当定义触发器时。必需要指定触发器的事件和触发的操作
包:包用于在逻辑上组合过程和函数。它由包规范和包体两部分组成
创建包(声明):
create package sp_package is
procedure update_sal(name varchar2,newsal number);
function annual_income(name varchar2) return number;
end;
/
给包实现包体:
create or replace package sp_package is
procedure update_sal(name varchar2,newsal number)
is
begin
update emp set sal=newsal where ename=name;
end;
function annual_income(name varchar2)
return number is
annual_salary number;
begin
select sal*12+nvl(comm,0) into annual_salary from emp
where ename=name;
return annual_salary;
end;
end;
/
怎样调用包。调用包中的过程和函数,调用的时候,须要在过程和函数面前加入包名
exec sp_package.update_sal('SCOTT',120);
PL/SQL基础 定义并使用变量
标量(scalar)-经常使用类型
在PL/SQL中
标量定义的案例:
(1)定义一个变长的字符串
v_ename varchar2(20)
(2)使用一个变量
数据赋值: :=
declare
c_tax_rate number(3,2) := 0.03;
v_ename varchar2(5);
v_sal number(7,2);
v_tax_sal number(7,2);
begin
--运行
select ename,sal into v_ename,v_sal from emp where empno = &no;
--计算所得税
v_tax_sal := v_sal*c_tax_rate;
--输出
dbms_output.put_line(姓名是:'' || v_ename ||'工资是:'||v_sal||'交税:'||v_tax_sal) ;
end;
标量(scalar)-使用%type类型:
v_ename emp.ename%type;//表示变量v_ename定义的大小和表emp的字段enamel大小一致
复合变量(composite)介绍:
用于存放多个值的变量,主要包含:
类似高级语言的结构体
type emp_recode_type is recode
(
name emp.ename%type,
salary emp.sal%type,
title emp.job%type
);
//定义了一个PL/SQL记录类型emp_recode_type,类型包括是哪个数据name,salary,title
sp_recode emp_recode_type;//定义了一个变量sp_recode,它的类型为emp_recode_type
详细编写:
declare
type emp_recode_type is record(name emp.ename%type,
salary emp.sal%type,
title emp.job%type);
sp_recode emp_recode_type;
begin
select ename,sal,job into sp_record from emp where empno=7788;
dbms_output.put_line('员工名:' || sp_record.name || '工资是' || sp_record.salary);
end;
复合类型:
相当于高级高级语言中的数组。可是须要注意的是在高级语言中数组的下标不能为负数。可是此处是能够为负数的
PL/SQL表实例:
declare
--index by binary_integer表示下标是整数,正整数和负整数都能够的
type sp_table_type is table of emp.ename%type index by binary_integer;
sp_table sp_table_type;
begin
select ename into sp_table(0) from emp where empno=7788;
dbms_output.put_line('员工名:' || sp_table(0));
end;
?怎样返回多条数据类型??
复合变量-參照变量
參照变量是指用于存放数值指针的变量,通过使用參照变量,能够使得应用程序共享同样的对象,从而减少占用的控件。在编写
PL/SQL程序时。能够使用游标比那辆(ref cursor)和对象类型变量(ref obj_type)两种參照变量类型
參照变量-ref cursor游标变量
使用游标时,当定义游标时不须要
declare
--定义游标类型sp_emp_cursor
type sp_emp_cursor is ref cursor;//定义了一个游标
--定义游标变量
test_cursor sp_emp_cursor;
--定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--运行
--把test_cursor 和一个 select结合,即test_cursor指向结果集
open test_cursor for select ename,sal from emp where deptno=&no;
loop
fetch test_cursor into v_ename,v_sal;
--推断工资高低。决定是否更新
--推断是否test_cursor为空
exit when test_cursor%notfound;
dbms_output.put_line('名字:' || v_name || '工资:' || v_sal);
end loop;
end;
复合变量-嵌套表
复合变量-复合表
玩转oracle学习第六天的更多相关文章
- 玩转oracle学习第七天
1.上节回想 2.PL/SQL的进阶 3.oracle的视图 4.oracle的触发器 目标: 1.掌握PL/SQL的高级使用方法(能编写分页过程模块,下订单过程模块.. . ) 2.会处理or ...
- 玩转oracle学习第五天
1.上节回想 2.维护数据的完整性 3.管理索引 4.管理权限和角色 1.掌握维护oracle数据完整性的技巧 2.理解索引的概念,会建立索引 3.管理oracle的权限和角色 介绍:维 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- Oracle学习线路
出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验) 作为oracle的基本功,需要大家对sql和 ...
- Oracle学习指南
Oracle学习指南 你走的那天,我决定不落泪,迎着风撑着眼帘用力不眨眼 创建数据库.创建用户.创建表空间.创建表.插入数据..... 1.用系统用户登录,任选系统用户 代码: >>sql ...
- 七、Android学习第六天——SQLite与文件下载(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 七.Android学习第六天——SQLite与文件下载 SQLite SQ ...
- Oracle学习系列1-7
Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 3 ...
- Oracle学习系列7
Oracle学习系列7 ************************************************************************************ 关联表 ...
- Oracle学习系列6
Oracle学习系列6 ************************************************************************************ 删除约 ...
随机推荐
- thrift 版本不一致导致 @Override 报错
thrift 版本不一致导致 @Override 报错 学习了:http://blog.csdn.net/antony1776/article/details/78920888 版本不一致导致的: 在 ...
- Linux 技巧:让进程在后台可靠执行的几种方法
我们常常会碰到这种问题.用 telnet/ssh 登录了远程的 Linux server,执行了一些耗时较长的任务, 结果却因为网络的不稳定导致任务中途失败.怎样让命令提交后不受本地关闭终端窗体/网络 ...
- c# 无法加载xxx.dll 找不到指定的模块(如何指定文件夹)
如果直接放在项目运行目录,例如bin/debug可以直接加载,但是这样比较乱. 如果在放debug里面的一个文件夹里面,有可能会报错“无法加载xxx.dll 找不到指定的模块”. 如果路径写成这样就会 ...
- HDU 4912 lca贪心
Paths on the tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- 2016.03.04,英语,《Vocabulary Builder》Unit 04
vor: 来自拉丁动词vorare,指to eat,-ivorous指吃某种食物的eater.carn肉,肉欲+vore吃→吃肉的:carnival狂欢节,谢肉节voracious a 狼吞虎咽的(v ...
- UI设计师不可不知的安卓屏幕知识-安卓100分享
http://www.android100.org/html/201505/24/149342.html UI设计师不可不知的安卓屏幕知识-安卓100分享 不少设计师和工程师都被安卓设备纷繁的屏幕搞得 ...
- PHP7添加swoole扩展
swoole需要php版本在7.0以上. 1.进入php目录中的bin目录下,通过pecl指令进行安装. cd /usr/local/php7/bin [root@localhost bin]# pw ...
- WSL初体验
Windows10 新增加了WSL子系统, 体验了一下感觉还不错... 开启对应的功能后, 在商店里选择安装Ubuntu就可以了. 迁移文件系统 WSL 的文件系统位于 C 盘,当安装的软件越来越 ...
- 移动端H5页面编辑器开发实战--原理结构篇
很久前的写的文章了,转载下发到这里 原文地址: https://blog.csdn.net/tech_meizu/article/details/52288797
- Spark Streaming概念学习系列之SparkStreaming的高层抽象DStream
不多说,直接上干货! SparkStreaming的高层抽象DStream 为了便于理解,Spark Streaming提出了DStream抽象,代表连续不断的数据流. DStream 是一个持续的R ...