热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle存储过程及Java调用

说说我的需求,以便让大家更顺利的看懂我的代码,我的需求是:存储过程从Java端接收两个参数userid(用户)和topicid(话题),在

说说我的需求,以便让大家更顺利的看懂我的代码,我的需求是:存储过程从Java端接收两个参数userid(用户)和topicid(话题),在

初次研究出bug的地方非常多,所以注意点非常多,花了我三天时间除尽所有bug,我会把注意点都列出来,可能有落下的地方,还请多指正,相互探讨。

首先上最终测试成功版存储过程代码:(里面代码可能不尽对你都有用,借鉴参考吧,我全贴出来也是为了我以后好查)

说一下jar包用的是ojdbc14.jar,至于什么class12.jar、ojdbc6.jar啊应该都可以,只要一种就可以了。

说说我的需求,以便让大家更顺利的看懂我的代码,我的需求是:存储过程从Java端接收两个参数userid(用户)和topicid(话题),在存储过程进行循环查询当前用户对当前话题的点赞记录,如果有记录,则record为设置1,没有则为0,最后返回一个结果集,是反应 用户=>话题=>record相互对应的关系表。

好了不废话了,上代码吧,学习阶段,所以难免情绪波动和啰嗦,也是希望以最直白能懂的方式叙述出来。

------------在数据库建立一个type,对应JAVA端要传入的对象结构 :
create or replace type tp_arr3 as Object
(
userid nvarchar2(40), --这里从varchar2改成nvarchar2类型才能跟Java的String匹配上
topicid nvarchar2(40),
record nvarchar2(4)
)

---多次测试创建可能会出现“ORA-02303: 无法使用类型或表的相关性来删除或取代一个类型”这个错误,这时只要换一个类型名字再创建就可以了
----------
CREATE OR REPLACE TYPE tp_arr_tbl3 AS TABLE OF tp_arr3
--------------创建包 ,创建一个游标类型用来放输出参数 
create or replace package testpkg as
type testcur is ref cursor;
end testpkg;
------创建存储过程 ,定义两个参数,一个入参,是一个对象类型数组(这种类型应该可以满足大部分复杂需求了),一个出参,是用游标存放查询值 
CREATE OR REPLACE procedure findRecord(type_obj IN tp_arr_tbl3,result out testpkg.testcur)
as
t tp_arr3;
sql2 varchar2(500);
sql3 varchar2(500);
v_count varchar2(4); --临时中间变量,用来存放对应的record 
BEGIN
sql2 :='drop table tb_temp';
sql3 :='CREATE TABLE tb_temp( userid varchar2(40),topicid varchar2(40) primary key, record varchar2(4))';
execute immediate sql2;
execute immediate sql3;

FOR i IN type_obj.first()..type_obj.last()
LOOP
t:= type_obj(i);
select count(*) into v_count from scott.tb_praise_rel where userid=t.userid and topicid=t.topicid;
dbms_output.put_line( t.userid || '=>'||t.topicid ||'=>' || v_count);
insert into tb_temp values (t.userid,t.topicid, v_count);
END LOOP;
COMMIT;

open result for select * from tb_temp;
END;
--------------执行存储过程

declare
ta tp_arr_tbl3:=tp_arr_tbl3(); --对象的声明 
t tp_arr3:=tp_arr3('0','0','0'); --声明及赋初值(必要步骤)
begin
for i in 1..12 loop
ta.extend;
t.userid:='1';
t.topicid:=i;
t.record:='0';
ta(i):=t;
findRecord(ta);
end loop;
end findRecord;

----------------------表查询测试部分
select * from tb_temp;

select * from scott.tb_praise_rel;

select userid from scott.tb_praise_rel where userid='1' and topicid='1';
-----------------------游标测试,,后来没用,可以略过
cursor testcur is select userid,topicid from scott.tb_praise_rel;
cur testcur%rowtype;

open testcur;
loop
fetch testcur into cur;
exit when testcur%notfound;
dbms_output.put_line( 'userid:' || cur.userid || ',topicid:' || cur.topicid );
update tb_temp set record='1' where userid=cur.userid and topicid=cur.topicid;
end loop;
dbms_output.put_line('----------------------');
close testcur;
COMMIT;

注意点:1.测试用户起初用的Scott,发现没有执行权限,对其进行赋予dba权限还是不行,遂后来用的system;2.多次测试创建可能会出现“ORA-02303: 无法使用类型或表的相关性来删除或取代一个类型”这个错误,这时只要换一个类型名字再创建就可以了;3.由于我的tb_temp表有唯一字段约束,所以存储过程每次进来先删表,再建表,再插入数据;4.记得该打分号的地方不要漏,不该打的地方不要多;5.执行存储过程的时候,要先声明并赋初值,不然也会报错;6.注意pl/sql里执行存储过程测试赋值时候ta.extend不能少;6.自定义类型要注意的地方很多,比如nvarchar2和JavaString类型的定义;7.简单说tp_arr3 类型是指一条记录,tp_arr_tbl3是指多条记录;

--点赞关系表
create table tb_praise_rel(
id varchar2(40) primary key,
userid varchar2(40), --用户id
topicid varchar2(40), --话题id
remarks1 varchar2(3000), --备用字段
remarks2 varchar2(3000),
remarks3 varchar2(3000)
);

再上Java调用代码:

package com.lofter.svntesr;

推荐阅读
  • 本文探讨了MySQL性能优化的策略与实践方法,首先介绍了通过phpMyAdmin工具进行基础优化的简便途径。在数据库设计阶段,选择合适的存储引擎至关重要,如InnoDB支持事务处理,虽然查询速度略逊于MyISAM,但因其高可靠性和数据完整性,在现代应用中更为广泛采用。此外,文章还深入讨论了索引优化、查询优化及配置参数调整等高级技术,为提升MySQL数据库的整体性能提供了全面指导。 ... [详细]
  • 转载于:https:blog.51cto.comquieth ... [详细]
  • 在 Virtmanager 图形界面中使用桥接网络
    在Virt-manager图形界面中使用桥接网络(bridgednetworking)2012-09-0315:40:23标签:virtm ... [详细]
  • php初级面试题之简述题(二):PHP初级面试题是刚要找工作的没什么经验的程序员看的,这对我们出去面试提供了不小的帮助,面试官会常常的考到我们,而这时候看的面试题就起了大作用了。1 ... [详细]
  • php黄色波浪线什么意思?
    导读:今天编程笔记来给各位分享关于php黄色波浪线什么意思的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: ... [详细]
  • 1、checkout时,提示:URLsvn:192.168.1.99svntestdoesntexist奇怪,怎么会提示库不存在呢?肯定是哪里配置问题。后来尝试了半天,也在网上搜 ... [详细]
  • svn:is not known to exist in the repository and is not part of the commit, yet its child解决办法
    提交修改的内容到svn报错:报错内容看错误提示,说的是提交的内容父目录不知道存在于仓库中并且不是提交的部分,包括它下面的子内容也不是提交的部分,于是我重新在另外一个地方下载svn内 ... [详细]
  • Clutter是一个支持2D界面的3D动画的UI库。Moblin使用Clutter创建美观、有效和直观的用户界面,您的程序也能做到。Clutter及其相关项目是Mob ... [详细]
  • Myeclipse2013 SVN安装方法
    转载自:http:www.itdaan.comimgs251164d9a4dcf5bfb689787da0034c3cae7ecc.jpe1.打开Help下的Instal ... [详细]
  • CentOs6.5基本环境配置(八):svn服务配置
    2019独角兽企业重金招聘Python工程师标准小编采用vm虚拟机进行安装svn版本控制工具,实际linux系统中安装性质一样,只需在客户端连接时 ... [详细]
  • Linux安装svn服务端
    安装使用yum安装非常简单:yuminstallsubversion配置创建仓库我们这里在home下建立一个名为svn的仓库(repositor ... [详细]
  • 1、安装VNCyuminstallvnc-server2、添加多个用户用户useradduser1添加用户user1passwduser1设置用户的linux登录密码suuser1 ... [详细]
  • Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理,现在在企业中的使用率也是很广的。git是一个分布式的版本控制系统,不像以前的svn,svn是 ... [详细]
  • 1、安装插件即可在源码管理中看见svn的选项subversion2、源码管理中配置svn的工程地址  3、点击Credentials的【添加】配置svn的用户名密码,完成后选取即可 ... [详细]
  • 今天安装TortoiseSVN的时候遇到的一点问题,不知道有没有人遇到过。也不知道有没有人发过这个,下面我简单的说一下。在安装完之后点击鼠标右键的时候会 ... [详细]
author-avatar
私受他
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有