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 ...
随机推荐
- 在mac电脑的terminal里该如何运行c语言
若要在 Mac 的终端中编译并运行 C 源代码,你首先需要安装 Command Line Tools,里面包含有 GCC 编译器.安装方法为: 打开终端,输入 gcc. 如果你没有安装 Command ...
- js interval ,timeout
var inter; intervatest("2019-08-22 09:12:00"); function intervatest(str) { ShowCountDown(s ...
- 在mysql中计算百分比
通过查找资料,得到了如下解决方法: 用到了concat()和left() 两个函数 1.CONCAT(str1,str2,...) 返回来自于参数连结的字符串.如果任何参数是NULL, 返回NULL. ...
- Android自定义View——实现字母导航栏
1.自定义View实现字母导航栏 2.ListView实现联系人列表 3.字母导航栏滑动事件处理 4.字母导航栏与中间字母的联动 5.字母导航栏与ListView的联动 1.先看主布局,方便后面代码的 ...
- 一天一个设计模式——工厂方法(FactoryMethod)模式
一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...
- 动手动脑 4 String 类
动手动脑1: 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 在Java中,内容相同的字串常量(“Hello”)只保存一份以 ...
- Qt creator中配置opencv win7 64bit
配置方法的原文来自https://www.librehat.com/qt-5-2-vs2012-opencv-2-4-7-dev-environment-setup-tutorial/. 补充,在张静 ...
- Anaconda: "WinError 127 找不到指定程序"
Ref: https://blog.csdn.net/mengmengz07/article/details/103629693 问题: Windows系统,使用Anaconda,conda crea ...
- 查看电脑连接的WiFi的密码
这里提供两种办法:图形界面操作版.命令行操作版 方法一: 打开控制面板 点击红色框部分 方法二 打开命令行:输入命令netsh wlan show profiles "连接的WiFi的名称& ...
- 201803-1 跳一跳 Java
思路: 一个变量plus记录叠加的数,遇到2就+2 import java.util.Scanner; public class Main { public static void main(Stri ...