`
百合不是茶
  • 浏览: 344642 次
社区版块
存档分类
最新评论

PL/SQL的类型和JDBC操作数据库

阅读更多

PL/SQL的标量类型:

   字符,数字,时间,布尔,%type五中类型的

--标量:数据库中预定义类型的变量
--定义一个变长字符串 
v_ename varchar2(10); 

--定义一个小数,范围 -9999.99~9999.99 
v_sal number(6,2); 

--定义一个小数并给一个初始值为5.4 :=是pl/sql的赋值号 
v_sal2 number(6,2):=5.4; 

--定义一个日期类型的数据 
v_hiredate date; 

--定义一个布尔变量,不能为空,初始值为false 
v_valid boolean not null default false; 

--定义一个常量,只能赋值一次,不可被修改
c_num  constant number(5) :=100;

 

--下面以输入id,显示账号和密码。
--说明变量的使用,看看如何编写。

创建过程

create or replace procedure pro_1(v_userid number) is
--根据table_pro表中的username来声明变量的数据类型
v_username table_pro.username%type;
v_userpwd table_pro.userpwd%type;
begin 
select username, userpwd into v_username,v_userpwd from table_pro where userid = v_userid;

dbms_output.put_line('账号:'||v_username||'密码:'||v_userpwd);
end;

 

打开输入输出

set serveroutput on

 

调用过程,查询userid为1的账号的密码

exec pro_1(1);

 

运行结果:

SQL> exec pro_1(1);
 
账号:王佳密码:11

 

 

------------------------------------------------复合类型------------pl/sql表和pl/sql记录------

pl/sql记录;将所有的数据放在记录中,类似java中的方法中的属性

 

定义包; is record表示是pl/sql的表记录

--定义一个函数过程,根据输入的员工编号,返回员工的账号和密码
create or replace package package_1 is
type table_type_record is record(
v_username table_pro.username%type,
v_userpwd table_pro.userpwd%type
);
end;

 定义过程来调用包;

--由于需要返回多个类型的值,需要定义两个变量接收
create or replace procedure pro_6(v_userid number) is
v_record package_1.table_type_record;
begin
  select username,userpwd into v_record.v_username,v_record.v_userpwd from table_pro where userid = v_userid;
 
dbms_output.put_line('账号:'||v_record.v_username||'密码:'||v_record.v_userpwd);
end;

 调用

exec pro_6(1);

 

SQL> exec pro_6(1);
 
账号:王佳密码:11

 

 

PL/SQL表;将字段存储在数组中,数组的开始可以为任意的一个数

获取table_pro表中的username字段

SQL> create  or replace procedure pro_4(v_userid number)is

    --定义一个Pl/SQL表类型:类似于数组类型
--数组类型名是emp_table_ename 存放的数据类型是emp.ename%type

--index by binary_integer下标自增长
  2  type table_type_username is table of table_pro.username%type index by binary_integer;
  3  --定义变量数组
  4  v_username table_type_username;
  5  begin
  6   select username into v_username(0) from table_pro where userid=v_userid;
  7  dbms_output.put_line(v_username(0));
  8  end;
  9  --以上会报错,多条数据需要使用参照变量

 

SQL> exec pro_4(1);
 
王佳
 

以上方法只可以输出一条;两条呢;

使用游标可以解决上面的问题

 

---------------------------------------游标类型 ref cursor

输出多个字段时候使用游标

游标的创建,创建名字为emp_cursor_type的游标

type emp_cursor_type is ref cursor;

打开游标 open +游标名+ for

open emp_cursor_type for

 

游标获取部门的所有名字和姓名

create or replace procedure pro_7(v_deptno number) is
--定义一个游标类型
type emp_cursor_type is ref cursor;
--定义游标变量,默认是关闭的
mycursor emp_cursor_type;

--定义变量接收游标中的数据
v_ename emp.ename%type;
v_sal emp.sal%type;

begin
  --打开游标并执行查询语句,将查询到的结果集交给游标管理
  open mycursor for select ename,sal from emp where deptno=v_deptno;
  --循环取出游标中的数据,
  loop
         --取游标的数据
         fetch mycursor into v_ename,v_sal;
         --当游标中没有数据的时候就结束循环
         exit when mycursor%notfound;
         dbms_output.put_line('姓名:'||v_ename||' 工资:'||v_sal);      
  end loop;
end;

 


 

JDBC调用过程实现增删改查

1,添加数据

,1,1增加数据的过程

SQL> create or replace procedure pro_add(v_username varchar2,v_userpwd varchar2) is
  2  
  3  begin
  4  insert into table_pro values(seq_pro.nextval,v_username,v_userpwd);
  5  end;
  6  /

 

1,2在JDBC中实现相应的方法,过程有几个参数就写几个?

//添加数据
	public void getAdd(String name,String pwd){
		try{
		Connection conn = ConnDB.getCon();
		//预编译
		String sql ="{call pro_add(?,?)}";
	
		CallableStatement csmt = conn.prepareCall(sql);
		csmt.setString(1, name);
		csmt.setString(2, pwd);
		csmt.execute();
		csmt.close();
		}catch(Exception ef){
			ef.printStackTrace();
		}
	}
	
}

 运行结果;userid前面已经执行了三次,所以现在是4

     USERID USERNAME   USERPWD
----------- ---------- ----------
          4 百合不是茶 baihe

 

2,删除 ,先定义过程再到jdbc中操作过程

 

3,修改 ;先定义过程再到jdbc中操作过程

 

 

4,查询;在jdbc中定义输入输出语句

in输入

out输出

定义过程

SQL> create or replace procedure pro_select(v_userid in number,v_username out varchar2,v_userpwd out varchar2) is
  2  begin
  3     select username,userpwd  into v_username,v_userpwd from table_pro where userid = v_userid;
  4  end;
  5  /
 

 jdbc的调用

// 获取全部的
	public void getAll(int id) {
		try {
			Connection conn = ConnDB.getCon();
			// 执行过程
			String sql = "{call pro_select(?,?,?)}";
			// 编译sql语句
			CallableStatement csmt = conn.prepareCall(sql);
			csmt.setInt(1, id);
			csmt.registerOutParameter(2, java.sql.Types.VARCHAR);
			csmt.registerOutParameter(3, java.sql.Types.VARCHAR);
			// 查询时间的操作
			// csmt.registerOutParameter(3, java.sql.Types.DATE);
			// DATE date = (DATE)csmt.getObject(4);
		    // SimpleDateFormat sp = new SimpleDateFormat("yyyy/MM/dd");
			// String date = sp.format(date);
			csmt.execute();
			String name = csmt.getString(2);
			String pwd = csmt.getString(3);
			System.out.println("账号:" + name + "密码:" + pwd);
		} catch (Exception ef) {
			ef.printStackTrace();
		}
	}

  

表中的数据

     USERID USERNAME   USERPWD
----------- ---------- ----------
          4 百合不是茶 baihe
          5 百合不是茶 baihe
          1 王佳       11
          2 王         1
          3 佳         2

运行的结果;

 demo.getAll(2);

账号:王密码:1

 

------------------------JDBC操作游标获取

创建过程

查询
create or replace package package_cursor is
   type   table_cursor is ref cursor;
end;

create or replace procedure pro_select(v_userid in number,table_cursor out package_cursor.table_cursor ) is
begin 
  open table_cursor for select username,userpwd  from table_pro where userid = v_userid;
end;

 

jdbc操作

// 获取游标的数据
	public void getCursor(int id) {
		try {
			Connection conn = ConnDB.getCon();
			// 执行过程
			String sql = "{call pro_select(?,?)}";
		CallableStatement csmt = conn.prepareCall(sql);
		csmt.setInt(1, id);
		csmt.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
		csmt.execute();
		//获取数据,游标类型可以强转成ResultSet
		ResultSet rs = (ResultSet)csmt.getObject(2);
		while(rs.next()){
			String name = rs.getString(1);
			String pwd = rs.getString(2);
			System.out.println("账号:" + name + "密码:" + pwd);
		}
		} catch (Exception ef) {
			ef.printStackTrace();
		}
	}

 

运行的结果;

demo.getAll(2);

账号:王密码:1

 

2
0
分享到:
评论

相关推荐

    Oracle 9i Java程序设计——使用PL/SQL和Java的解决方案

    具体介绍了Java消息处理和图像生成工具,协同使用PL/SQL和Java的方法,操作系统资源的使用,优化Java应用程序的性能,SQL在PL/SQL和Java中的执行基准,Oracle JDBC和 SQLJ等内容。给PL/SQL程序员提供了Java教程。...

    PL/SQL 基础.doc

    6) PL/SQL: 存储在数据库内运行, 其他方法为在数据库外对数据库访问,只适合ORACLE; 2. PL/SQL 1) PL/SQL(Procedual language/SQL)是在标准SQL的基础上增加了过程化处理的语言; 2) Oracle客户端工具访问Oracle...

    使用JDBC总结操作数据库

    //相当于我们的第三方工具pl/sql 2. 通过驱动获取连接对象Connection con=DriverManager.getConnection(“jdbc:oracle:thin:@10.1.12.138:1521:orcl","scott", "de123");//相当与通过我们的用户名和密码登陆我们的pl...

    Oracle 9i Java程序设计 使用PL SQL和Java的解决方法

    具体介绍了Java消息处理和图像生成工具,协同使用PL/SQL和Java的方法,操作系统资源的使用,优化Java应用程序的性能,SQL在PL/SQL和Java中的执行基准,Oracle JDBC和 SQLJ等内容。给PL/SQL程序员提供了Java教程。...

    JDBC 3.0数据库开发与设计

    2.1.1 SQL数据库数据库基本操作语句 2.1.2 Microsoft SQL Server数据库设计及ODBC配置 2.1.3 Oracle 数据库的基本说明及其使用简介 2.1.4 MySQL的安装及使用简介 2.2 使用JDBC连接数据库 2.2.1 SQLJ基本知识 ...

    Oracle SQL Developer连接报错(ORA-12505)的解决方案(两种)

    之前用PL/SQL DEVELOPER和SQLPLUS 登录数据库都没有问题,就是应用程序通过JDBC连接Oracle时无法成功连接,出现ORA-12505错误listener does not currently know of SID given in connect descriptor

    Java数据库技术详解 DOC简版

    5.3 JDBC操作数据库 5.4 本章小结 第6章 JDBC的高级特性 6.1 PreparedStatement预编译对象 6.2 CallableStatement存储过程对象 6.3 BatchedUpdate对象 6.4 Rowset行集合对象 6.5 JDBC的事务 6.6 本...

    jdbc连接数据库的方式2

    如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象...

    数据库原理实验指导书(06计科)(金山)(10学时)

    通过JDBC方式访问数据库 通过ODBC方式访问数据库 使用PL/SQL编写存储过程访问数据库

    Oracle 从入门到精通视频教程(11G版本)(ppt)

    PL/SQL中使用DML和DDL语言 PL/SQL中的异常 PL/SQL函数编写 第8章-游标,数据的缓存区 什么是游标 显示游标 隐式游标 第9章-视图,数据库中虚拟的表 什么是视图 视图的创建 操作视图数据的限制 视图的...

    本机不安装ORACLE直接连接服务器上的ORACLE

    机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库 1、先到Oracle网站下载Instant Client : http://www.oracle.com/technology/global/cn/software/tech/oci/instantclient/index.html 根据你的操作系统...

    Oracle SQL Develop简介

    使用 SQL Developer,可以浏览数据库对象、运行 SQL 语句和 SQL 脚本,并且还可以编辑和调试 PL/SQL 语句。还可以运行所提供的任何数量的报表(reports),以及创建和保存自己的报表(reports)。SQL Developer 可以提高...

    windowx64 oracle12.2.0.1.0 命令行工具集

    SQL*Plus: SQL*Plus 是 Oracle 提供的命令行界面工具,用于与 Oracle 数据库进行交互、执行 SQL 查询、PL/SQL 代码和管理数据库对象。 exp 和 imp: exp 和 imp 是 Oracle 提供的导出和导入工具,用于在 Oracle ...

    DBVisualizer Pro

    DBVisualizer Pro 64位支持各种关系数据库,它可以通过JDBC驱动同时和多个不同的数据库建立连接,对管理者和...这款软件以JDBC的方式来连接数据库,因而不仅可用于操作DB2数据库,也可用来操作Oracle,SQLSERVER等。

    swing开发的数据库工具(DBAnywhere4.77),是开发mis系统的好帮手

    swing开发的数据库管理...改,查的sql语句,还可以生成对表操作的代码,支持批量表的数据导入和导出(支持blob/clob),写sql有自动提示功能,像pl/sql developer一样,还有其他功能不再多描述,是开发mis系统的好帮手.

    《SQL数据库管理工具》(Richardson Software RazorSQL)v5.1.1/含注册机

    软件简介:RazorSQL 是数据库查询工具、SQL的编辑、数据库管理工具,可以通过ODBC,JDBC连接数据库,已经证实可以使用的数据库种类,达到了29种. RazorSQL is an SQL query tool, database browser, SQL ...

    dbvis_windows-x64_9_5_7_jre.exe

    dbvisualizer 64位支持各种关系数据库,它可以通过JDBC驱动同时和多个不同的数据库建立连接,对管理者和开发人员...这款软件以JDBC的方式来连接数据库,因而不仅可用于操作DB2数据库,也可用来操作Oracle,SQLSERVER等

    Oracle Database 11g完全参考手册中文版.part1

    《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句...

    Oracle Database 11g完全参考手册中文版.part2

    《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句...

    oracle database 11g 高清完整中文版part2

     第38章 实现对象类型、对象视图和方法  第39章 收集器(嵌套表和可变数组)  第40章 使用大对象  第41章 面向对象的高级概念 第ⅵ部分 oracle 中的java  第42章 java 简介  第43章 jdbc 程序设计  第44章 ...

Global site tag (gtag.js) - Google Analytics