oracle存储过程--在应用程序中访问存储过程程序完整举例

认识存储过程和函数

存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的。和PL/SQL程序相比,存储过程有很多优点,具体归纳如下:

* 存储过程和函数以命名的数据库对象形式存储于数据库当中。存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上登录到数据库,并调用或修改代码。

* 存储过程和函数可由数据库提供安全保证,要想使用存储过程和函数,需要有存储过程和函数的所有者的授权,只有被授权的用户或创建者本身才能执行存储过程或调用函数。

* 存储过程和函数的信息是写入数据字典的,所以存储过程可以看作是一个公用模块,用户编写的PL/SQL程序或其他存储过程都可以调用它(但存储过程和函数不能调用PL/SQL程序)。一个重复使用的功能,可以设计成为存储过程,比如:显示一张工资统计表,可以设计成为存储过程;一个经常调用的计算,可以设计成为存储函数;根据雇员编号返回雇员的姓名,可以设计成存储函数。

* 像其他高级语言的过程和函数一样,可以传递参数给存储过程或函数,参数的传递也有多种方式。存储过程可以有返回值,也可以没有返回值,存储过程的返回值必须通过参数带回;函数有一定的数据类型,像其他的标准函数一样,我们可以通过对函数名的调用返回函数值。

存储过程和函数需要进行编译,以排除语法错误,只有编译通过才能调用。

首先得有表盒数据,那么第一步就是创建表盒插入数据:

SQL> create table emp
  2  (empno number,
  3  ename varchar2(10),
  4  sal number,
  5  job varchar2(100)
  6  );

Table created

SQL> insert into emp values(1,'王一',10000,'软件工程师');

1 row inserted

SQL> insert into emp values(2,'王二',8000,'摄影师');

1 row inserted

SQL> select * from emp;

     EMPNO ENAME             SAL JOB
---------- ---------- ---------- --------------------------------------------------------------------------------
         1 王一          10000 软件工程师
         2 王二           8000 摄影师

SQL> 

现在叫我们查询某个员工姓名,月薪和职位,那么我们创建一个存储过程如下:

--out参数:查询某个员工姓名,月薪和职位
/*
  思考:
  1、查询某个员工的所有信息-->out参数太多?
  2、查询某个部门中所有员工的所有信息-->out中返回集合?
*/
--删除存储过程

create or replace procedure queryempincome1(eno in number,
                                           pename out varchar2,
                                           psal out number,
                                           pjob out varchar2)
as
begin
   --得到该员工的姓名、月薪和职位
   select ename,sal,job into pename,psal,pjob from emp where empno=eno;
end;
/

然后我们在eclipse里面编写Java代码链接oracle数据库和访问存储过程,在控制台输出指定id的用户的基本信息:

package cn.edu.jdbc;

import java.sql.CallableStatement;
import java.sql.Connection;

import oracle.jdbc.OracleTypes;

import org.junit.Test;
/**
 * create or replace procedure queryempinform(eno in number,
                                           pename out varchar2,
                                           psal out number,
                                           pjob out varchar2)
 * @author wf
 *
 */
public class TestProcedure {
	@Test
	public void testProcedure(){
		//{call <procedure-name[(<arg1>,<arg2>,<arh3>...)]>}
		String sql = "{call queryempincome1(?,?,?,?)}";

		Connection connection = null;
		CallableStatement call = null;
		try {
			//得到一個连接
			connection = JDBCUtils.getConnection();
			//通过连接创建输出statement
			call = connection.prepareCall(sql);

			//对于in(输入)参数,要赋值
			call.setInt(1, 2);//为第一个存储过程的参数赋值为1表示查询编号为1的员工信息

			//对于out(输出),需要申明
//			call.registerOutParameter(2, sqlType);
			call.registerOutParameter(2, OracleTypes.VARCHAR);//指定oracle的输出参数类型
			call.registerOutParameter(3, OracleTypes.NUMBER);
			call.registerOutParameter(4, OracleTypes.VARCHAR);

			//执行调用
			call.execute();

			//取出结果
			String name = call.getString(2);
			Double sal = call.getDouble(3);
			String job = call.getString(4);
			System.out.println("姓名:"+name+"\t"+"薪水:"+sal+"\t"+"工作:"+job);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 19:26:00

oracle存储过程--在应用程序中访问存储过程程序完整举例的相关文章

在java程序中访问windows有用户名和密码保护的共享目录

在java程序中访问windows有用户名和密码保护的共享目录 Posted on 2015-11-20 14:03 云自无心水自闲 阅读(3744) 评论(0)  编辑  收藏 --> Java程序中访问拥有全部读写权限的目录相对比较简单,和普通的目录没有什么差别.但是要访问一个需要用户和密码验证的目录就需要一点点小技巧了.这里介绍一个开源的库能够比较容易的实现这一需求.1. 下载库文件: https://jcifs.samba.org/ 下载的zip文件中, 不仅包含了jar文件,还有文档和

iOS程序中打开其他程序的方法

1.1 如果被打开程序不是自己的,则要找到被打开App的URL Schemes. http://jbguide.me/2012/09/12/how-to-find-url-schemes%EF%BC%9F/ 1.2 如果被打开程序是自己写的,那么写程序时要实现 1) appname-info.plist里增加 <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes<

C#程序中访问配置文件

在C#编程中,有时候会用到配置文件,那么该如何在程序中获取或修改配置文件中的相关数据呢?下面采用一个简单的C#控制台程序来说明. 新建一个C#控制台程序,打开“解决方案资源管理器”,如下图: 可以看到里面没有配置文件,下面使用修改.net的版本来将其调出来.选中工程,单击右键,选择属性.   此时配置文件出来了.按照下图添加配置信息: 好了,现在我们就添加代码来访问这些信息. ? 1 2 3 4 5 6 7 8 9 /// <summary> /// 在配置信息中根据指定的键获取值. ///

在SQL Server数据库中执行存储过程很快,在c#中调用很慢的问题

记录工作中遇到的问题,分享出来: 原博客地址:https://blog.csdn.net/weixin_40782680/article/details/85038281 今天遇到一个比较郁闷的问题,如下图: 点击库存或者点击销售,查询数据很慢,有的将近几十秒,查询数据用的是存储过程,在数据库中执行存储过程,查询数据是很快的,速度非常理想,1秒不到,但是c#程序中调用就要很久. 百度了很多,后来这上面的那篇文章中找到了原因所在: 原因分析:由于存储过程是预编译的, 在第一次执行的时候, 会生成执

了解 Oracle Berkeley DB 可以为您的应用程序带来 NoSQL 优势的原因及方式。

将 Oracle Berkeley DB 用作 NoSQL 数据存储 作者:Shashank Tiwari 2011 年 2 月发布 “NoSQL”是在开发人员.架构师甚至技术经理中新流行的一个词汇.尽管这个术语最近很流行,但令人惊讶的是,它并没有一个普遍认可的定义. 通常来说,任何非 RDBMS 且遵循无模式结构的数据库一般都不能完全支持 ACID 事务,并且因高可用性的承诺以及在横向伸缩环境中支持大型数据集而普遍被归类为“NoSQL 数据存储”.鉴于这些共同特征(与传统的 RDBMS 的特征

在CG/HLSL中访问着色器属性(Properties)

在CG/HLSL中访问着色器属性 Shader在Properties块中访问材质属性.如果你想在一个着色程序中访问一些属性,你需要声明一个Cg/HLSL具有相同的名称和一个匹配的类型的变量. Properties 例如这些材质属性: _MyColor ("Some Color", Color) = (1,1,1,1) _MyVector ("Some Vector", Vector) = (0,0,0,0) _MyFloat ("My float"

用java程序直接访问URL地址

/**       * 程序中访问http数据接口       */      public static String getURLContent(String urlStr) {                     /** 网络的url地址 */           URL url = null;                    /** http连接 */       HttpURLConnection httpConn = null;                   /**/

关于C++类中访问权限的若干疑问(虚函数访问权限)

下面这样一个程序:(以下程序都是在VS2010下实现) 1: class Base 2: { 3: public: 4: virtual void func() 5: { 6: cout<<"Base virtual func"<<endl; 7: } 8: }; 9: 10: class Derived: public Base 11: { 12: private: 13: virtual void func() 14: { 15: cout<<&

程序中五大内存分区

本文介绍C/C++中堆,栈及静态数据区. 五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.下面分别来介绍: 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收. 自由存储区,就是那些由malloc等分