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

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 PL/SQL学习官方教材

    5. **记录和表操作**:PL/SQL提供了内置的DML(数据操纵语言)语句,如INSERT、UPDATE、DELETE,可以直接在PL/SQL块中操作数据库表。教材还会讲解如何使用BULK COLLECT和FORALL语句进行批量操作,提高效率。 6. **...

    PL/SQL免安装版

    3. **数据库操作**:PL/SQL可以直接在SQL语句中执行DML(数据操纵语言)操作,如INSERT、UPDATE、DELETE,以及DDL(数据定义语言)操作,如CREATE、ALTER和DROP。 4. **存储过程和函数**:PL/SQL允许创建在数据库...

    oracle_oracle_oraclepl/sql_

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作能力和过程性编程语言的控制结构。在"Oracle PL/SQL"这本书中,作者深入浅出地探讨了这一语言的核心概念和实用技巧,尤其适合法语...

    ORALCE PL/SQL程序设计第五版

    4. **集合和记录类型**:PL/SQL支持集合类型,如数组和关联数组,以及自定义记录类型,这些允许你存储和操作多条数据。集合和记录类型大大增强了处理复杂数据结构的能力。 5. **索引和触发器**:在Oracle数据库中,...

    PL/SQL7.5开发工具

    4. **数据浏览和操作**:直接在工具中查询和修改数据库中的数据,无需打开额外的查询工具。 5. **版本控制集成**:可以与常见的版本控制系统如SVN或Git集成,便于团队协作和代码版本管理。 6. **报表生成**:自动...

    PL/SQL存储过程编程

    - 关注于数据查询和操作,而非具体的实现细节。 - 缺少过程和控制结构。 - 没有算法的概念。 - **PL/SQL**: - 扩展了变量和类型的支持。 - 引入了更丰富的控制结构。 - 支持过程和函数的创建。 - 提供了对象...

    PL/SQL Develope8

    4. **PL/SQL与SQL的区别**:SQL是用于查询和操作数据库的标准语言,而PL/SQL是Oracle特有的扩展,增加了流程控制、循环、异常处理等编程特性。 5. **PL/SQL Developer的局限性**:虽然它是一个强大的工具,但可能不...

    PL_SQL Project.zip_exampleh93_pl/sql中的project_zip

    标题中的“PL_SQL Project.zip_exampleh93_pl/sql中的project_zip”表明这是一个关于PL/SQL项目的压缩文件,可能包含了与数据库编程相关的项目源代码或文档。"exampleh93"可能是该项目的一个特定版本或者示例编号,...

    OracleClient精简版和PL/SQL Developer 1104

    4. **数据浏览和操作**:提供数据网格视图,方便查看和修改数据库中的数据。 5. **版本控制集成**:支持多种版本控制系统,如SVN、Git,便于团队协作。 6. **报表和图表**:生成关于数据库性能和使用的统计报告,...

    PL/SQL Developer 中文帮助文档

    - **用工程项目工作**:使用工程管理器来浏览和操作工程文件。 - **编译工程**:编译工程中的所有程序。 #### 十三、任务项目 - **创建任务项目**:定义特定的任务集合。 - **编辑任务项目**:修改任务项目的属性。...

    oracle数据库操作,安装 pl/sql操作

    以下是PL/SQL的一些核心概念和操作: 1. **声明变量**:可以声明各种类型的变量,如数值、字符串和记录类型。 2. **控制流程语句**:包括IF-THEN-ELSE、CASE、FOR循环、WHILE循环等,用于控制程序执行路径。 3. **...

    PL/SQL Developer10andorcle客户端

    Oracle客户端和PL/SQL Developer是数据库开发者和管理员常用的工具,尤其在处理Oracle数据库时。本文将详细介绍这两个组件及其重要性。 首先,Oracle客户端是连接到Oracle数据库服务器的软件,允许用户进行查询、...

    Oracle客户端PL/SQL 中文乱码解决

    在Oracle数据库环境中,PL/SQL是Oracle数据库内置的编程语言,用于编写数据库应用程序。然而,当用户在使用Oracle客户端进行PL/SQL开发时,经常遇到一个棘手的问题——中文乱码。这个问题通常出现在查询结果、日志...

    PL/SQL

    PL/SQL(Procedural Language/Structured Query Language)是Oracle公司开发的一种过程化编程语言,专为Oracle数据库设计,它结合了SQL的查询功能和传统的过程编程语言的特点,使得数据库操作更加高效、强大且灵活。...

    本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库

    "使用 PL/SQL Developer 连接远程 Oracle 数据库无需安装 Oracle 客户端" 在本文中,我们将讨论如何使用 PL/SQL Developer 连接远程 Oracle 数据库而不需要安装 Oracle 客户端。为此,我们将使用 Oracle 提供的 ...

    PL/SQL ExcelDocumentType

    PL/SQL是Oracle数据库中的编程语言,它扩展了SQL,允许开发人员编写存储过程、函数和触发器等。而ExcelDocumentType可能指的是一个特定的库或自定义类型,用于读取、写入或操作Microsoft Excel文件。 描述中提到的...

    《Oracle PL/SQL 实例精解》说明

    11. **数据库对象操作**:创建和修改表、视图、索引等数据库对象,以及触发器的使用,是PL/SQL实际应用中的重要技能。 12. **游标变量和自定义类型**:如何利用游标变量处理多行结果,以及如何定义和使用自定义数据...

    Web程序实现简易版PL/SQL和Execel表配置备份SQL语句

    - **数据库接口**:可能通过JDBC(Java)或ODBC(Node.js)来连接和操作Oracle数据库。 3. **PL/SQL执行** 用户可以通过Web界面输入或上传PL/SQL脚本,后台程序接收到请求后,解析脚本并执行。执行过程可能涉及:...

    PL/SQL Developer instantclient-11-2

    通常,这个压缩包会包含一系列动态链接库(如oci.dll、sqlplus.exe等)、配置文件和必要的头文件,开发者或DBA可以将它们解压到指定目录,然后配置环境变量,以便在不安装完整客户端的情况下进行数据库连接和操作。...

    oracle 8i pl/sql秘籍

    与Java的交互也是Oracle数据库应用中常见的情景,Oracle提供了JDBC(Java Database Connectivity)接口,使得Java程序员能够连接、查询和操作Oracle数据库。这部分内容可能涉及JDBC驱动的分类、连接池的配置、以及...

Global site tag (gtag.js) - Google Analytics