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
相关推荐
具体介绍了Java消息处理和图像生成工具,协同使用PL/SQL和Java的方法,操作系统资源的使用,优化Java应用程序的性能,SQL在PL/SQL和Java中的执行基准,Oracle JDBC和 SQLJ等内容。给PL/SQL程序员提供了Java教程。...
6) PL/SQL: 存储在数据库内运行, 其他方法为在数据库外对数据库访问,只适合ORACLE; 2. PL/SQL 1) PL/SQL(Procedual language/SQL)是在标准SQL的基础上增加了过程化处理的语言; 2) Oracle客户端工具访问Oracle...
//相当于我们的第三方工具pl/sql 2. 通过驱动获取连接对象Connection con=DriverManager.getConnection(“jdbc:oracle:thin:@10.1.12.138:1521:orcl","scott", "de123");//相当与通过我们的用户名和密码登陆我们的pl...
具体介绍了Java消息处理和图像生成工具,协同使用PL/SQL和Java的方法,操作系统资源的使用,优化Java应用程序的性能,SQL在PL/SQL和Java中的执行基准,Oracle JDBC和 SQLJ等内容。给PL/SQL程序员提供了Java教程。...
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基本知识 ...
之前用PL/SQL DEVELOPER和SQLPLUS 登录数据库都没有问题,就是应用程序通过JDBC连接Oracle时无法成功连接,出现ORA-12505错误listener does not currently know of SID given in connect descriptor
5.3 JDBC操作数据库 5.4 本章小结 第6章 JDBC的高级特性 6.1 PreparedStatement预编译对象 6.2 CallableStatement存储过程对象 6.3 BatchedUpdate对象 6.4 Rowset行集合对象 6.5 JDBC的事务 6.6 本...
如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象...
通过JDBC方式访问数据库 通过ODBC方式访问数据库 使用PL/SQL编写存储过程访问数据库
PL/SQL中使用DML和DDL语言 PL/SQL中的异常 PL/SQL函数编写 第8章-游标,数据的缓存区 什么是游标 显示游标 隐式游标 第9章-视图,数据库中虚拟的表 什么是视图 视图的创建 操作视图数据的限制 视图的...
机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库 1、先到Oracle网站下载Instant Client : http://www.oracle.com/technology/global/cn/software/tech/oci/instantclient/index.html 根据你的操作系统...
使用 SQL Developer,可以浏览数据库对象、运行 SQL 语句和 SQL 脚本,并且还可以编辑和调试 PL/SQL 语句。还可以运行所提供的任何数量的报表(reports),以及创建和保存自己的报表(reports)。SQL Developer 可以提高...
SQL*Plus: SQL*Plus 是 Oracle 提供的命令行界面工具,用于与 Oracle 数据库进行交互、执行 SQL 查询、PL/SQL 代码和管理数据库对象。 exp 和 imp: exp 和 imp 是 Oracle 提供的导出和导入工具,用于在 Oracle ...
DBVisualizer Pro 64位支持各种关系数据库,它可以通过JDBC驱动同时和多个不同的数据库建立连接,对管理者和...这款软件以JDBC的方式来连接数据库,因而不仅可用于操作DB2数据库,也可用来操作Oracle,SQLSERVER等。
swing开发的数据库管理...改,查的sql语句,还可以生成对表操作的代码,支持批量表的数据导入和导出(支持blob/clob),写sql有自动提示功能,像pl/sql developer一样,还有其他功能不再多描述,是开发mis系统的好帮手.
软件简介:RazorSQL 是数据库查询工具、SQL的编辑、数据库管理工具,可以通过ODBC,JDBC连接数据库,已经证实可以使用的数据库种类,达到了29种. RazorSQL is an SQL query tool, database browser, SQL ...
dbvisualizer 64位支持各种关系数据库,它可以通过JDBC驱动同时和多个不同的数据库建立连接,对管理者和开发人员...这款软件以JDBC的方式来连接数据库,因而不仅可用于操作DB2数据库,也可用来操作Oracle,SQLSERVER等
《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句...
《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句...
第38章 实现对象类型、对象视图和方法 第39章 收集器(嵌套表和可变数组) 第40章 使用大对象 第41章 面向对象的高级概念 第ⅵ部分 oracle 中的java 第42章 java 简介 第43章 jdbc 程序设计 第44章 ...