一、oracle的pl/sql的概念

pl/sql是oracle在标准的sql语言上的扩展,不仅允许嵌入sql,还允许定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能更强大。

1.过程、函数、触发器是pl/sql编写的

2.过程、函数、触发器是在oracle中

3.pl/sql是非常强大的数据库过程语言

4.过程、函数可以在java程序中调用

优点:增加程序的程序化编程、减少网络传输等、提高安全性、应用程序的运行性能

缺点:移植性不好

二、pl/sql的编程语言(包括函数、过程、触发器、包等)

简单例子:编写一个存储过程,该过程可以向某表中添加记录

create or replace  procedure sp_prol is 

begin

insert into mytest values('djw','m124');

end;

/

show error 查看错误

1) exec 过程名(参数值1,参数值2....)

2)call  过程名(参数值1,参数值2....)

1.pl/sql的编程最小的基础单位是块,用块可以编写过程、函数、触发器、包

2.编写规范:

定义变量为v_

定义常量为c_

定义游标_cursor

定义例外e_

3.块由3个部分构成:定义部分(declear),执行部分(begin)、例外部分(exception)

实例:

1.dbms_output是oracle所提供的包(类似java的开发包),该包包含一些过程,put_line就是dbms_output包的一个过程。

set serveroutput on;
begin
dbms_output.put_line('hello,word');
end;
/

2.写一个块如下,可以输入变量:

declare
    v_name varchar2(5);
begin
     select ename into v_name from emp  where empno=&no;
     dbms_output.put_line('雇员名'||v_name);
end;
/

3.写一个块如下,可以输入变量且输入例外:

declare
  v_name varchar2(5);
begin 
   select ename into v_name from emp where empno=&no;
   dbms_output.put_line('雇员名:'||v_name);
exception
   when no_data_found then
   dbms_output.put_line('朋友,你的编号输入有误');
end;
/

4.过程:过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out).通过在过程中使用输入参数,可以将数据传递到执行部分,通过在过程中输出参数,可以将执行部分的数据传递到应用环境。

实例:

1)请写过程,输入雇员的名,新的工资,修改雇员的工资

create procedure  sp_pro3(spName varchar2,newSal number) is
begin
  update emp set sal=newSal where ename=spName;
end;
/

2)如何调用过程两种方法

exec  \call

5.函数:函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须return语句返回的数据,我们可以使用create  function来建立函数

6.包:包用于在逻辑上组合过程和函数,由包规范和包体组成

----创建包sp_package
create package sp_package is
procedure update_sal (name varchar2,sal number);
function annual_income(name varchar2) return number;
end;
--创建具体的包体sp_package
create package body sp_package is
procedure update_sal(name varchar2,sal number)
  is
  begin
     update emp set sal=sal 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;

    /

7.定义和使用变量

标量:

1)v_name varchar2(10);

2)v_sal   number(6,2);

3)v_sal2  number:=5.4---表示赋值,初始值

4)v_hiredate  date

5)  v_valid   boolean  not null  default false;

存放最普通的变量:

1)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;

/

2)declare
  c_tax_rate number(3,2):=0.03;
  v_ename  emp.ename%type;
  v_sal  emp.sal%type;
  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;

复合变量:用于存放多个值的变量

declare

type emp_record_type is record(

name  emp.ename%type,

salary emp.sal%type,

title emp.job%type);

sp_record emp_record_type;

begin

select ename,sal,job into sp_record from emp where empno=7788;

dbms_output.put_line('员工名'||emp_record.name);

end;

参照变量:

参照变量是指用于存放数值指针的变量,通过使用参照变量,可以使得应用程序共享相同对象,从而降低占用的空间,在编写pl/sql程序时,可以使用游标变量和对象类型变量两种参照变量类型。

1)请使用pl/sql编写一个块,可以输入部门号,并显示该部门

set serveroutput on;

declare

--定义游标

type sp_emp_cursor is ref  cursor;

--定义一个游标变量

test_cursor sp_emp_cursor;

--定义变量

v_ename emp.ename%type;

v_sal  emp.sal%type;

begin

open  test_cursor  for  select ename,sal from  emp  where deptno=&no;

loop

fetch test_cursor into v_ename,v_sal;

exit  when test_cursor%notfound;

dbms_output.put_line('名字'||v_ename||'工资:'||v_sal);

end loop;

end;

if语句的用法

create or replace  procedure sp_pro6(spName varchar2(10)) is
v_sal emp.sal%type
begin
  select sal into v_sal from emp where ename=spName;
if v_sal<2000  then
  update emp set sal=sal+sal*10% where ename=spName;
end if;
end;

3种循环(for循环省略)

create or replace procedure sp_pro6(spName varchar2) is
v_num  number:=1;
begin
  loop
    insert into users values(v_num,spName);
    exit when v_num=10;
    v_num:=v_num+1;
  end loop;
end;
--
create or replace procedure sp_pro6(spName varchar2) is
v_num  number:=1;
begin
while v_num<=20 loop
    insert into users values(v_num,spName);
    v_num:=v_num+1;
  end loop;
end;

自定义例外:

视图:视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。(视图是随表的变化而变化)

1)视图不占磁盘空间

2)视图有利于提高安全性,不同用户看到的视图不同

3)视图不能增加索引

4)视图可以简化复杂查询

5)视图和视图也可以进行关联查询

创建视图:

create view 视图名 as select xxx with read only

9.windows-oracle实战第九课--plsql的更多相关文章

  1. Tensorf实战第九课(自编码AutoEncoder)

    本节我们将了解神经网络进行非监督形式的学习,即autoencoder自编码 假设图片经过神经网络后再输出的过程,我们看作是图片先被压缩然后解压的过程.那么在压缩的时候,原有的图片质量被缩减,解压时用信 ...

  2. 【C语言探索之旅】 第二部分第九课: 实战"悬挂小人"游戏 答案

    内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 答案 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题, ...

  3. 解决Windows x64bit环境下无法使用PLSQL Developer连接到Oracle DB中的问题

    本文是原创文章,转载请注明出处: http://blog.csdn.net/msdnchina/article/details/46416455 解决Windows x64bit环境下无法使用PLSQ ...

  4. 【C语言探索之旅】 第一部分第九课:函数

    内容简介 1.课程大纲 2.第一部分第九课:函数 3.第一部分第十课预告: 练习题+习作 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...

  5. Windows10 下安装 oracle 客户端,安装 plsql 破解并实现汉化

    一,软件准备 1,win10 操作系统 2,oracle_11g_r2 client 这里是 64 位的软件  3, plsql 11.0.6 这里我们下载 64 的,32 位操作系统现在已经很少了, ...

  6. NeHe OpenGL教程 第九课:移动图像

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. oracle在SQLPLUS 和PLSQL建 job 的区别

    oracle在SQLPLUS 和PLSQL建 job 的区别 //建立job variable test_job_really number; begin dbms_job.submit(:test_ ...

  8. 有奖试读—Windows PowerShell实战指南(第2版)

    为什么要学PowerShell? Windows用户都已习惯于使用图形化界面去完成工作,因为GUI总能轻易地实现很多功能,并且不需要记住很多命令.使得短时间学会一种工具成为可能. 但是不幸的是,GUI ...

  9. Python第九课学习

    Python第九课学习 数据结构: 深浅拷贝 集合set 函数: 概念 创建 参数 return 定义域 www.cnblogs.com/yuanchenqi/articles/5782764.htm ...

随机推荐

  1. AndroidAutoLayout

    AndroidAutoLayout [DEPRECATED]Android屏幕适配方案,直接填写设计图上的像素尺寸即可完成适配. 目前没有精力,已停止维护,使用前务必看明白代码,明确该方案可以解决自身 ...

  2. 十七、CI框架之数据库操作insert用法

    一.代码如下: 二.我们访问一下页面 三.查看数据库,已经插入了一条数据 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  3. HDU - 1068 Girls and Boys(二分匹配---最大独立集)

    题意:给出每个学生的标号及与其有缘分成为情侣的人的标号,求一个最大集合,集合中任意两个人都没有缘分成为情侣. 分析: 1.若两人有缘分,则可以连一条边,本题是求一个最大集合,集合中任意两点都不相连,即 ...

  4. Ubuntu 16.04 上安装 CUDA 9.0 详细教程

    https://blog.csdn.net/QLULIBIN/article/details/78714596 前言: 本篇文章是基于安装CUDA 9.0的经验写,CUDA9.0目前支持Ubuntu1 ...

  5. oracle(9) 序列和约束

    序列 SEQUENCE 也是数据库对象之一,作用:根据指定的规则生成一些列数字. 序列通常是为某张表的主键提供值使用. 主键:通常每张表都会有主键字段,该字段的值要求非空且唯一, 使用该字段来确定表中 ...

  6. Python自学之路---Day01

    目录 Python自学之路---Day01 注释 单行注释 多行注释 print()函数 语法 参数 实例 input()函数 语法 参数 实例 查看Python的关键字 代码 变量与常量 变量 如何 ...

  7. rewrite例子集合

    在 httpd 中将一个域名转发到另一个域名 虚拟主机世界近期更换了域名,新域名为 www.wbhw.com, 更加简短好记.这时需要将原来的域名 webhosting-world.com, 以及论坛 ...

  8. UVA 10891 SUM游戏 DP

    刚看到这个题目不知道怎么个DP法,有点难想到 解法如下 设置dp[i][j]代表i到j这段子序列能获得的最大值,这样,枚举m=min(m,dp[i+1到j][j],dp[i][i到j-1]),m就代表 ...

  9. selenium破解人人登陆验证码

    from selenium import webdriverfrom PIL import Imagefrom chaojiying import Chaojiying_Clientimport ti ...

  10. 吴裕雄--天生自然MySQL学习笔记:MySQL LIKE 子句

    在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录. WHERE 子句中可以使用等号 = 来设定获取数据的条件, ...