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学习第六天的更多相关文章

  1. 玩转oracle学习第七天

     1.上节回想 2.PL/SQL的进阶 3.oracle的视图 4.oracle的触发器 目标: 1.掌握PL/SQL的高级使用方法(能编写分页过程模块,下订单过程模块.. . ) 2.会处理or ...

  2. 玩转oracle学习第五天

     1.上节回想 2.维护数据的完整性 3.管理索引 4.管理权限和角色 1.掌握维护oracle数据完整性的技巧  2.理解索引的概念,会建立索引  3.管理oracle的权限和角色   介绍:维 ...

  3. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  4. Oracle学习线路

    出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验)    作为oracle的基本功,需要大家对sql和 ...

  5. Oracle学习指南

    Oracle学习指南 你走的那天,我决定不落泪,迎着风撑着眼帘用力不眨眼 创建数据库.创建用户.创建表空间.创建表.插入数据..... 1.用系统用户登录,任选系统用户 代码: >>sql ...

  6. 七、Android学习第六天——SQLite与文件下载(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 七.Android学习第六天——SQLite与文件下载 SQLite SQ ...

  7. Oracle学习系列1-7

    Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 3 ...

  8. Oracle学习系列7

    Oracle学习系列7 ************************************************************************************ 关联表 ...

  9. Oracle学习系列6

    Oracle学习系列6 ************************************************************************************ 删除约 ...

随机推荐

  1. Web安全扫描工具

    使用 Ibm security appscan  进行WEB安全扫描. 1.SQL注入: 2.发现内部IP泄露模式: 3.已解密的登录请求: 4.HTML注释敏感信息泄露:

  2. string转utf8后解决TTS识别中文的问题

    今天遇到string字符编码的问题,由于遇到了用TTS将文本转语音的一个API,里面的中文必须是utf8的,我传了一个uncode编码的中文进去,就一直不能正常读出来.后来才发现是编码的问题.这里在网 ...

  3. AS常见的错误

    导入的项目使用的gradle版本和本地的要一致,不然会提示类似"Minimum supported Gradle version is 3.3. Current version is 2.1 ...

  4. [Oracle] - Connect to a PDB of Oracle12c

    Story about CDB and PDB Oracle12c has a new feature and definition of CDB and PDB. If you first use ...

  5. 深刻理解Java中的String、StringBuffer和StringBuilder的差别

    声明:本博客为原创博客,未经同意.不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(链接为http://blog.csdn.net/bettarwang/article/detai ...

  6. MySQL具体解释(8)----------MySQL线程池总结(二)

    这篇文章是对上篇文章的一个补充,主要环绕下面两点展开.one-connection-per-thread的实现方式以及线程池中epoll的使用. one-connection-per-thread 依 ...

  7. Java 零基础跑起第一个程序

    Java 零基础跑起第一个程序 一 概述 1  java代码编译 编译后才干在计算机中执行.编译就是把人能看懂的代码转换成机器能看懂的形式 2 java的长处 一次编译.到处执行.由于java代码是在 ...

  8. hdoj--2534--Score(gcd)

    Score Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. BZOJ 3674/BZOJ 3673 主席树

    思路: 主席树维护可持久化数组 剩下的就是普通的并查集了- //By SiriusRen #include <cstdio> #include <cstring> #inclu ...

  10. 如何解决“因为计算机中丢失php_mbstring.dll”

    配置编译环境时,php.exe报系统错误,无法启动此程序,因为计算机中丢失php_mbstring.dll. 在C:\Windows找到php.ini文件,ctrl+f找到extension=php_ ...