当前位置: 代码迷 >> SQL >> oracle学习札记14-PLSQL1
  详细解决方案

oracle学习札记14-PLSQL1

热度:93   发布时间:2016-05-05 13:26:03.0
oracle学习笔记14--PLSQL1
pl/sql编程实例:
1. 只包括执行部分的pl/sql块
set serveroutput on;打开输出选项

begin 	dbms_output.put_line(‘hello’);end;


dbms_output是oracle所提供的包(类似Java的开发包), 该包包含一些过程,put_line就是该包的一个过程。
2.包含定义部分和执行部分的pl/sql块


	declare		v_ename varchar2(5);--定义字符串变量		v_sal number(7,2);--定义number类型的变量表示工资	begin	select ename,sal into v_ename,v_sal from emp where empno=&no;	dbms_output.put_line(‘雇员名:’||v_ename||’ 工资:’||v_sal);	end;


&表示接收从控制台 输入的变量
3. 包含定义部分、执行部分、例外处理部分
为了避免pl/sql程序运行错误,提高健壮性,应该对可能的错误进行处理,这个很有必要
a. 比如在上面的例子中,如果输入了不存在的雇员号,应当做例外处理
b. 有时出现异常,希望用另外的逻辑处理
另外,oracle预先定义了一些例外,no_data_found就是找不到数据的例外


declare		v_ename varchar2(5);--定义字符串变量		v_sal number(7,2);--定义number类型的变量表示工资	begin	select ename,sal into v_ename,v_sal from emp where empno=&no;	dbms_output.put_line(‘雇员名:’||v_ename||’ 工资:’||v_sal);	exception 	when no_data_found then 	dbms_output.put_line(‘朋友,你输入的编号有误’);	end;


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


SQL> create procedure morf_pro1(empName varchar2,newSal number) is  2  begin  3  update emp set sal=newSal where ename=empName;  4  end;  5  /SQL> call morf_pro1('SCOTT',3003);


其实,过程如果是在sqlplus中调用意义就不大了,主要是在程序中,如下例子,是在Java程序中调用。
首先我这有一个book表:


SQL> desc book;
Name         Type         Nullable Default Comments
------------ ------------ -------- ------- --------
BOOKID       NUMBER       Y                        
BOOKNAME     VARCHAR2(50) Y                        
PUBLISHHOUSE VARCHAR2(50) Y

然后我写了一个过程,用于向表中插入一条数据:

create or replace procedure insert1book(mbookId in number,mbookName in varchar2,mpublishHouse in varchar2) isbegininsert into book values(mbookId,mbookName,mpublishHouse);end;


下面给出调用的Java程序:

//调用一个没有返回值的存储过程package com.morflame;import java.sql.*;public class Test1 {	public static void main(String[] args) {		try {			Class.forName("oracle.jdbc.driver.OracleDriver");			Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");			CallableStatement cs=conn.prepareCall("{call insert1book(?,?,?)}");			cs.setInt(1, 10);			cs.setString(2, "笑傲江湖");			cs.setString(3, "人民出版社");			cs.execute();			cs.close();			conn.close();		} catch (ClassNotFoundException e) {			// TODO Auto-generated catch block			e.printStackTrace();		} catch (SQLException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}}


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

--函数:得到某个人的年薪create function morf_fun1(name varchar2) return number isyearSal number(7,2);beginselect sal*12+nvl(comm,0)*12 into yearSal from emp where ename=name;return yearSal;end;

再给出一个简单例子:
package morflame;import java.sql.*;public class TestOraPro1 {	public static void main(String[] args) {		// TODO Auto-generated method stub		String driver="oracle.jdbc.driver.OracleDriver";		String dburl="jdbc:oracle:thin:@localhost:1521:orcl";		String dbuser="scott";		String dbpass="tiger";				Connection conn=null;		Statement stmt=null;		ResultSet rs=null;				CallableStatement cs=null;//准备CallableStatement对象来调用过程				try {			Class.forName(driver);			conn=DriverManager.getConnection(dburl,dbuser,dbpass);			cs=conn.prepareCall("{call morf_pro1(?,?)}");			cs.setString(1, "SCOTT");			cs.setInt(2,999);			cs.execute();			cs.close();						stmt=conn.createStatement();			rs=stmt.executeQuery("select morf_fun1('SCOTT') from dual");			if(rs.next())			System.out.println(rs.getInt(1));						rs.close();			stmt.close();			conn.close();		} catch (ClassNotFoundException e) {			// TODO Auto-generated catch block			e.printStackTrace();		} catch (SQLException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}}

在sqlplus中调用函数
var income number;
call morf_fun1(‘scott’) into:income;
print income;
不过这个方法实在是没啥用处……
  相关解决方案