`

Oracle PL/SQL 学习

阅读更多

编写一个存储过程,该过程可以向某表中添加数据

1. 创建一个简单的表

create table mytest(
       name varchar2(30),
       passwd varchar2(30)
);

 

2. 创建过程  

--replace 表示如果有sp_pro,则替换
create  or replace procedure sp_pro is
begin
--执行部分
insert into mytest ('crazygrass','crazy');
end;
/

 执行上面的过程时,会报错,可以同过 show error 来查看报错信息。更正如下:

--replace 表示如果有sp_pro,则替换
create  or replace procedure sp_pro is
begin
--执行部分
insert into mytest values('crazygrass','crazy');
end;
/

 

如何调用该过程。

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

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

执行以下

 exec sp_pro;
-- 然后
select * from mytest;

 

  •   简单分类

 ----- --  过程(存储过程)

 -------   函数

块(编程) -------    触发器

 -------  

  •   编写规范

1)        注视

单行注释

select * from emp where empno=7788;-- 取得员工信息

多行注释

/*…..*/ 来划分

2)        标志符号的命名规范

1.       当定义变量时,建议使用 v_ 作为前缀 v_sal

2.       当定义常量时,建议使用 c 最为前缀 c_rate

3.       当定义游标时,建议使用 _cursor 作为后缀 emp_cursor

4.       当定义例外时,建议使用 e 作为前缀 e_error

  块( block )是 pl/sql 的基本程序单元,编写 pl/sql 程序实际上就是编写 pl/sql 块。要完成相对简单的应用功能,可能只需要编写一个 pl/sql 块;但是如果想要实现发杂的功能,可能需要在一个 pl/sql 块中嵌套其他的 pl/sql

  • 块结构示意图

        Pl/sql 块由三个部分构成:定义部分,执行部分,例外处理部分

     如下所示:

        declear

      /* 定义部分 --- 定义常量、变量、游标、例外、复杂数据类型 */

              begin

/* 执行部分 ---- 要执行的 pl/sq sql 语句 */

exception

/* 例外处理部分 --- 处理运行的各种错误 */

          end;

       declear

  定义部分是可选的

   exception

  例外部分也是可选的

 

实例 1- 只包括执行部分的 pl/sql

打开输出选项

set serveroutput on
 begin
   dbms_output.put_line(‘hello’);
end;

 

实例 2— 包含定义部分和执行部分的 pl/sql

 

--有定义和执行部分的块
declare 
--定义变量
   v_name varchar2(5); 
begin
--执行部分
   select ename into v_name from emp where empno=&no;
--在控制台显示用户名
   dbms_output.put_line('用户名是:'||v_name);
end;

 当有两个或者多个变量需要赋值时,注意他们赋值的顺序。

--有定义和执行部分的块
declare 
--定义变量
   v_name varchar2(5); 
   v_sal  number(7,2);
begin
--执行部分
   select ename,sal into v_name, v_sal from emp where empno=&no;
--在控制台显示用户名
   dbms_output.put_line('用户名是:'||v_name||' 工资:'||v_sal);
end;

 

相关说明:&表示从控制台输入。

 

 

  • 实例 3- 包含定义部分,执行部分和例外处理部分 为了避免 pl/sql 程序的运行错误,提高 pl/sql 的健壮性,应该对可能的错误进行处理,这个很有必要:
  • 1)  比如在实例 2 中,如果输入了不存在的雇员号,应当做例外处理
  • 2)   有时出现异常,希望用另外的逻辑处理我们看看如何完成 1 的要求

--有定义和执行部分的块
declare 
--定义变量
   v_name varchar2(5); 
   v_sal  number(7,2);
begin
--执行部分
   select ename,sal into v_name, v_sal from emp where empno=&no;
--在控制台显示用户名
   dbms_output.put_line('用户名是:'||v_name||' 工资:'||v_sal);
--异常处理
exception 
when no_data_found then
dbms_output.put_line('No datas!');
end;
 

   相关说明: oracle 事先预定义了一些例外, no_data_found 就是找不到数据的例外。

 

  过程

过程用于执行特定的操作。当建立过程时,既可以指定输入参数( in ),也可以制定输出参数 (out) 。通过在过程中使用输入参数,可以将数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。在 sqlplus 中可以使用 create procedure 命令来建立工程。

实例如下:

1 请考虑编写一个存储过程 ,可以输入雇员号,新工资,可修改雇员的工资

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

3 如何在 java 程序中调用一个存储过程

 

特别说明:

对于过程我们会在以后给大家详细具体的介绍,现在先介绍个概念。

Java 调用存储过程:

 

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class TestOracleProcedure {

	public static void main(String[] args) {
		try {
                        //1.加载驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//2.获得连接
                        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ora92","scott","tiger");
			//3.创建CallableStatement
			CallableStatement cs = conn.prepareCall("{call sp_pro4(?,?)}");
			//4.给?赋值
			cs.setString(1, "alex");
			cs.setInt(2, 10);
			//5.执行
			cs.execute();
			cs.close();
			conn.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		print("ok!");
	}
	
	public static void print(Object o){
		System.out.println(o);
	}
}
  • 函数

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

--输入雇员的姓名,返回雇员的年薪

create function sp_fun2(spName varchar2) return

number is annual number(7,2);

begin

--执行部分

select sal*12+nvl(comm,0) into annual from emp where ename=spName;

return annual;

end;

--通过sqlplus调用

Sql>var money number;

Sql>call sp_fun2(‘alex’) into:money;

Sql>print money;

  包用于在逻辑上组合过程和函数,它是包规范和包体两部分组成。

  1 我们可以使用 create package 命令来创建包:

--创建一个包

--声明该包有个过程

create package sp_package is

procedure update_sal(name varchar2,newSal number);

function annual_income(name varchar2) return number;

end;
 

2 建立包体可以使用 create package body 命令

 

--给包 sp_package 实现包体
create or replace package body 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 number;
begin
select sal*12+nvl(comm,0) into annual from emp
where ename=name;
return annual;
end;
end; 



3 如何调用包的过程或是函数

  当调用包的过程或函数时,在过程和函数前需要带有报名,如果要访问其他方案的包,还需要在报名前方加上方案名。

如:

  Sql> call sp_package.update_sal(‘alex’,55);

特别说明:

包是 pl/sql 中非常重要的部分,我们可以在使用过程分页时,将再次体验它的威力。

  •   触发器

触发器是指银行的执行的存储过程。当定义触发器时,必须要指定触发的事件和触发的操作,常用的触发事件包括 insert update delete 语句,而触发操作实际就是一个 pl/sql 块。可以使用 create trigger 来建立触发器

 

特别说明:

  触发器 是非常非常重要的。

  •   介绍

  在编写 pl/sql 程序时,可以定义变量和常量;在 pl/sql 程序中包括有:

1.         标量类型

标量案例

1.       定义一个边长字符串

V_name varhcar2(10);

2.       定义一个小数 范围 -9999..99~9999.99

v_sal number(6,2)

3.       定义一个小数并给一个初始值为 5.4:= pl/sql 的赋值符号

V_sal2 number(6,2):=5.4;

4.       定义一个日期类型的数据

V_hiredate date;

5.       定义一个布尔变量,不能为空,初始值为 false

V_valid boolean not null default fase;

 

输入员工的号,显示雇员姓名,工资,个人所得税(税率 0.03 )为例。

--create procedure tax is 
declare
c_tax_rate number(3,2):=0.03;
--用户名
v_name varchar2(20);
v_sal number(7,2);
v_tax_sal number(7,2);
begin
   select ename,sal into v_name,v_sal 
   from emp
   where empno=&id;
--计算所得税
v_tax_sal := v_sal * c_tax_rate;  
dbms_output.put_line('姓名:'||v_name||' 工资:'||v_sal||'交税:'||v_tax_sal);
end;

  注意:定义标量时,如果取回的数据长度大于定义的长度,则会发生缓存区溢出。解决方法,更改为这样 v_name emp.ename% type ; 不仅可以解决问题,而且还可以提高效率。

2.         复合类型

用于存放多个值的变量。主要包括以下几种:

1 pl/sql 记录(常用)

类似与高级语言的结构体 ,需要注意的是当引用 pl/sql 记录成员时,必须要加记录变量作为前缀(记录变量 . 记录成员)如下:

 

--pl/sql 记录实例
declare
--定义一个pl/sql记录类型 emp_record_type,类型包含三个字段
type emp_record_type is
record(name emp.ename%type,
       salary emp.sal%type,
       title emp.job%type);
--定义了一个sp_record变量,这个变量的类型是emp_record_type      
sp_record emp_record_type;
begin
select ename,sal,job into sp_record
from emp where empno=7698;
dbms_output.put_line('姓名'||sp_record.name);
end;

3 .pl/sql 表(常用)

  相当于高级语言中的数据。但是需要注意的是,在高级语言中数组的下标不能为负数,而 pl/sql 是可以为负数的,并且表元素的下标没有限制。实例如下:

--pl/sql表实例
declare
--定义了一个pl/sql表类型sp_table_type,该类型是用于存放emp.ename%type 类型的数组
--index by binary_integer 表示下标正数
type sp_table_type is table of emp.ename%type
index by binary_integer;
--定义了一个sp_table_type 类型的变量
sp_table sp_table_type;
begin
select ename into sp_table(0) from emp where empno=7698;
dbms_output.put_line('员工姓名:'||sp_table(0));
end;

     一次只能返回一行,那么怎么解决这个问题呢? 那么就要使用我们的参照变量类型。

 

4. 参照类型

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

1.       参照变量 -ref cursor 游标变量

使用游标时,当定义游标时不需要指定相应的 select 语句,但是当使用游标时( open 时)需要指定 select 语句,这样一个游标就与一个 select 语句结合了。实例如下:

1 请使用 pl/sql 编写一个块,可以输入部门号,并显示该部门所有员工姓名和对应的工资。

 

 

--使用pl/sql编写一个块,可以输入部门号,并显示该部门所有姓名和工资。
declare
--定义一个游标
type sp_emp_cursor is ref cursor;
--定义一个游标变量
test_cursor sp_emp_cursor;
--定义变量
v_name emp.ename%type;
v_sal emp.sal%type;
begin
--执行
--把test_cursor和一个select结合
open test_cursor for select ename,sal from emp where deptno=&no;
--循环取出
loop
     fetch test_cursor into v_name,v_sal;
     --判断是否test_cursor为空
     exit when test_cursor%notfound;
     dbms_output.put_line('名字:'||v_name);
end loop;
end; 
 

 

分享到:
评论

相关推荐

    Oracle PL/SQL学习官方教材

    以下是对"Oracle PL/SQL学习官方教材"中可能包含的主要知识点的详细解释: 1. **基础概念**:首先,教材会介绍PL/SQL的基本概念,包括块(Block)、变量(Variable)、常量(Constant)、数据类型(Data Types)和...

    Oracle PL/SQL实战(待续)

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计...通过实践和学习"Oracle PL/SQL实战(待续)"的相关内容,我们可以提升在Oracle环境中解决问题的能力,更好地管理和优化数据库系统。

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **集合与记录**:学习如何使用PL/SQL中的集合和记录类型,这些结构可以帮助更高效地处理数据集。 - **游标**:介绍游标的使用方法,包括隐式游标和显式游标,以及如何利用游标遍历查询结果。 #### 四、PL/SQL中的...

    oracle pl/sql从入门到精通 配套源代码

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作功能与PL/SQL的程序设计特性,广泛应用于Oracle数据库的开发和管理。这本书"Oracle PL/SQL从入门到精通"的配套源代码,显然是为了...

    Oracle PL/SQL程序设计(第5版)(套装上下册)

    《Oracle PL/SQL程序设计(第5版)(套装上下册)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何...

    Oracle PL/SQL实例精解 数据库建立代码

    总结起来,"Oracle PL/SQL实例精解 数据库建立代码"涵盖了数据库设计、对象创建、索引优化以及数据插入等多个方面,是学习和提升Oracle数据库管理技能的宝贵资源。通过解析和执行这些示例,开发者可以更好地理解和...

    Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本

    Oracle PL/SQL是一种强大的编程语言,它将关系数据库的强大功能与结构化编程的优点结合在一起,是Oracle数据库系统中不可或缺的一部分。在"Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本"中,读者可以深入...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括...这本书籍将为读者提供一个全面、系统的学习路径,帮助数据库管理员、开发人员深入理解并掌握ORACLE PL/SQL的强大功能和应用技巧。

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    通过学习这些内容,开发者可以掌握Oracle PL/SQL的高级特性,从而设计和实现更高效、更稳定的数据库应用程序。无论你是数据库管理员、系统架构师还是开发人员,这本书都将为你提供宝贵的指导,助你在Oracle数据库...

    oracle pl/sql实例精讲student数据库模式数据和表脚本

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据库操作能力和Procedural Language的编程结构,用于在Oracle数据库环境中创建复杂的应用程序。在"Oracle PL/SQL实例精讲student数据库模式"中,我们将深入探讨...

    oracle10g_pl/sql

    通过深入学习Oracle 10g PL/SQL,不仅可以掌握数据库编程的基本技能,还能了解如何利用这些技能来设计和实现复杂的业务逻辑,优化数据库性能,以及更好地维护和管理Oracle数据库系统。本教程涵盖了所有这些关键知识...

    Oracle PL/SQL best practice

    Oracle PL/SQL最佳实践 Oracle PL/SQL是一种强大的编程语言,用于在Oracle数据库环境中构建复杂的业务逻辑和数据处理任务。Steven Feuerstein,被誉为Oracle PL/SQL语言的大师,分享了他在这一领域的关键最佳实践和...

    oracle PL/SQL pdf学习资料

    oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料

    Oracle PL/SQL programming(5th Edition)

    ### Oracle PL/SQL Programming知识点概览 #### 一、书籍基本信息 ...通过阅读本书,读者可以快速掌握PL/SQL的基础知识,并学习如何利用Oracle Database 11g Release 2的强大功能来构建高效的应用程序。

    oracle 9i pl/sql程序设计笔记

    ### Oracle 9i PL/SQL程序设计笔记精要 #### PL/SQL基础知识概览 **标题与描述**:本文档围绕“Oracle 9i PL/SQL程序设计笔记”这一核心主题,深入探讨了PL/SQL语言的基础知识及其在Oracle 9i数据库环境中的应用。...

    Oracle PL/SQL by Example(4th Edition)

    《Oracle PL/SQL by Example(4th Edition)》是一本专为Oracle数据库用户设计的PL/SQL编程指南,尤其适合那些希望通过实践学习这一强大的过程式语言的开发者。本书的第四版详细介绍了Oracle PL/SQL的各种核心概念和...

    《精通Oracle PL/SQL》源码

    Oracle PL/SQL是一种强大的编程语言,...记得结合书中的解释和说明,逐步剖析和学习每个示例,这样能够更有效地掌握Oracle PL/SQL的精髓。同时,不断实践和调试代码,将有助于你在实际工作中更好地应对各种数据库挑战。

    Oracle PL/SQL编程及最佳实践

    Oracle PL/SQL 编程及最佳实践 Oracle PL/SQL 是一种高级编程语言,用于开发 Oracle 数据库中的...Oracle PL/SQL 编程及最佳实践是一个非常重要的知识点,对于学习 Oracle 数据库和 PL/SQL language 都非常有帮助。

Global site tag (gtag.js) - Google Analytics