9.windows-oracle实战第九课--plsql
一、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的更多相关文章
- Tensorf实战第九课(自编码AutoEncoder)
		
本节我们将了解神经网络进行非监督形式的学习,即autoencoder自编码 假设图片经过神经网络后再输出的过程,我们看作是图片先被压缩然后解压的过程.那么在压缩的时候,原有的图片质量被缩减,解压时用信 ...
 - 【C语言探索之旅】 第二部分第九课: 实战"悬挂小人"游戏 答案
		
内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 答案 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题, ...
 - 解决Windows x64bit环境下无法使用PLSQL Developer连接到Oracle DB中的问题
		
本文是原创文章,转载请注明出处: http://blog.csdn.net/msdnchina/article/details/46416455 解决Windows x64bit环境下无法使用PLSQ ...
 - 【C语言探索之旅】 第一部分第九课:函数
		
内容简介 1.课程大纲 2.第一部分第九课:函数 3.第一部分第十课预告: 练习题+习作 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...
 - Windows10 下安装 oracle 客户端,安装 plsql 破解并实现汉化
		
一,软件准备 1,win10 操作系统 2,oracle_11g_r2 client 这里是 64 位的软件 3, plsql 11.0.6 这里我们下载 64 的,32 位操作系统现在已经很少了, ...
 - NeHe OpenGL教程 第九课:移动图像
		
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
 - oracle在SQLPLUS 和PLSQL建 job 的区别
		
oracle在SQLPLUS 和PLSQL建 job 的区别 //建立job variable test_job_really number; begin dbms_job.submit(:test_ ...
 - 有奖试读—Windows PowerShell实战指南(第2版)
		
为什么要学PowerShell? Windows用户都已习惯于使用图形化界面去完成工作,因为GUI总能轻易地实现很多功能,并且不需要记住很多命令.使得短时间学会一种工具成为可能. 但是不幸的是,GUI ...
 - Python第九课学习
		
Python第九课学习 数据结构: 深浅拷贝 集合set 函数: 概念 创建 参数 return 定义域 www.cnblogs.com/yuanchenqi/articles/5782764.htm ...
 
随机推荐
- 每天一点点之laravel框架开发 - Laravel5.6去除URL中的index.php
			
在项目routes/web.php文件中添加了自定义的路由后,访问localhost/index.php/aaa,可以正常访问,但是去掉index.php后,提示404 Not Found 1. 按照 ...
 - maven的理解和使用
			
一.maven是什么? maven是项目管理工具 二.maven为什么要用? 在做开发的时候常常会用到外部的工具包(jar包),这就需要你一个一个的去他们的官网下工具包,然后在项目里依赖他们,比较的麻 ...
 - 卷积神经网络应用于tensorflow手写数字识别(第三版)
			
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_dat ...
 - spring boot redis 缓存(cache)集成
			
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
 - 2020/1/31 PHP代码审计之文件包含漏洞
			
0x00 文件包含简介 文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校检,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意 ...
 - POJ 3911:Internet Service Providers
			
Internet Service Providers Time Limit: 2MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I ...
 - kube-apiserver常用配置项
			
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" ...
 - zabbix安装及配置
			
一.安装zabbix_server 二.安装zabbix_agent 三.zabbix配置详解
 - BZOJ [Scoi2010]游戏
			
题解: 解法一:建立图论模型,发现只要联通块中有环则这个联通块中的值都可以被攻击到 如果是树,则只能攻击size-1个 解法二:二分图匹配,二分答案,看看是否能攻击到mid #include<i ...
 - 【数据结构】Hash表简介及leetcode两数之和python实现
			
文章目录 Hash表简介 基本思想 建立步骤 问题 Hash表实现 Hash函数构造 冲突处理方法 leetcode两数之和python实现 题目描述 基于Hash思想的实现 Hash表简介 基本思想 ...