Oracle 游标java

create table bank_user(

   card_id varchar2(18) primary key,  --身份证号码

   user_name varchar2(100), ---姓名

   ye number,               ---余额(冗余的)

   status number            ---状态 1正常 0锁定

);

drop table deal_record;

create table deal_record(

   id number primary key,

   - number, -- 1.存钱 2.取钱  3.转出  4.转入

   card_id varchar2(18),      -- 交易者

   money number,

   dest_card_id varchar2(18)  -- 转出对象

);

 

 

select * from bank_user

select * from deal_record where card_id='123'

-- 合理的冗余(重复)是一种科学的表现

-- 科学在以空间换时间

insert into bank_user values('123','小明',100,1);

insert into bank_user values('456','小红',300,1);

--3笔事务

1.小明存钱2000元

insert into deal_record values(1,1,'123',2000,null);

update bank_user set ye=ye+2000 where card_id='123';

commit;

2.小明取钱300元

insert into deal_record values(2,2,'123',300,null);

update bank_user set ye=ye-300 where card_id='123';

commit;

3.小明转钱给小红,1500

INSERT INTO deal_record VALUES (3,3,'123',1500,'456');

INSERT INTO deal_record VALUES (4,4,'456',1500,NULL);

UPDATE bank_user SET ye=ye-1500 WHERE card_id = '123';

UPDATE bank_user SET ye=ye+1500 WHERE card_id = '456';

COMMIT

 

select * from deal_record where  card_id = '456';

select myseq.nextval from dual

-- 存钱的存储过程

create or replace procedure p_add

(

user_id in bank_user.card_id%type,

add_money in deal_record.money%type

)

as

begin

    insert into deal_record values(myseq.nextval,1,user_id,add_money,null);

    update bank_user set ye=ye+add_money where card_id=user_id;

end;

-- 取钱的存储过程

create or replace procedure p_min

(

user_id in bank_user.card_id%type,

min_money in deal_record.money%type

)

as

begin

    insert into deal_record values(myseq.nextval,2,user_id,min_money,null);

    update bank_user set ye=ye-min_money where card_id=user_id;

end;

----

--转账的存储过程

create or replace procedure p_tran

(

user_id1 in bank_user.card_id%type,--转出人

user_id2 in bank_user.card_id%type,--转入人

money in deal_record.money%type

)

as

begin

  INSERT INTO deal_record VALUES (myseq.nextval,3,user_id1,money,user_id2);

  INSERT INTO deal_record VALUES (myseq.nextval,4,user_id2,money,NULL);

  UPDATE bank_user SET ye=ye-money WHERE card_id = user_id1;

  UPDATE bank_user SET ye=ye+money WHERE card_id = user_id2;

end;

 

-- pl/sql自己用的游标

-- 查询业务记录

--1.用户id 2.业务类型(1.查选所有收入 2.查询所有的指出 3.全部)

   user_id in bank_user.card_id%type,--转出人

   query_type in number

   

create or replace procedure p_query

(

 user_id bank_user.card_id%type

)

IS

  mydeal deal_record%rowtype;

  cursor mycursor is select * from deal_record where card_id=user_id;

begin

  --打开游标

  open mycursor;

  loop

     fetch mycursor into mydeal;

     exit when mycursor%notfound;

     

     dbms_output.put_line(mydeal.card_id||'   '||mydeal.money);

     

  end loop;

end;

--------------

create or replace procedure p_query

(

 user_id in bank_user.card_id%type,

 deal_type in deal_record.deal_type%type,

 mycursor out sys_refcursor

)

is

begin

  if deal_type=1 then

    open mycursor for select * from deal_record where card_id = user_id and deal_type in (1,4);

  elsif deal_type=2 then

    open mycursor for select * from deal_record where card_id = user_id and deal_type in (2,3);

  elsif deal_type=3 then

    open mycursor for select * from deal_record where card_id = user_id;

  end if;

end;

 

 

 

declare

  cursortype sys_refcursor;

  mycursor cursortype%type;

  mydeal deal_record%rowtype;

begin

  p_query('123',1,mycursor);

  loop

     fetch mycursor into mydeal;

     exit when mycursor%notfound;

     dbms_output.put_line(mydeal.card_id||'   '||mydeal.money);

  end loop;

end;

 

select * from deal_record

-- java调用的游标

-- 报错的例子

create or replace procedure p_java_query(mycursor out cursor)

is

begin

  open mycursor for select id,deal_type,card_id,money,dest_card_id from deal_record;

end p_java_query;

 

----------------------------

--- 第一步:建立一个程序包(用于定义一个指针变量,引用指针)

-- 看图,就是绿色的东西

create or replace package mypackage as

  type

    my_cursor is ref cursor;

end mypackage;

commit

------------

 

create or replace procedure p_java_query(java_cursor out mypackage.my_cursor)

is

begin

  open java_cursor for select * from deal_record;

end p_java_query;

-----------------

create or replace procedure p_java_query(java_cursor out mypackage.my_cursor)

is

begin

  open java_cursor for select id,(case deal_type when 1 then '存钱' when 2 then '取钱' when 3 then '转出' when 4 then '转入' ELSE '未知' end) deal_type,card_id,money,dest_card_id from deal_record;

end p_java_query;

-----------------

 

select * from dba_objects where OBJECT_TYPE='PACKAGE' and object_name='MYPACKAGE'

-----------

-- 增加查询人

create or replace procedure p_java_query(user_id in deal_record.card_id%type,java_cursor out mypackage.my_cursor,user_name out bank_user.user_name%type,ye out bank_user.ye%type)

is

begin

  open java_cursor for select id,(case deal_type when 1 then '存钱' when 2 then '取钱' when 3 then '转出' when 4 then '转入' ELSE '未知' end) deal_type,card_id,money,dest_card_id from deal_record where card_id=user_id;

  select user_name,ye into user_name,ye from bank_user where card_id=user_id;

end p_java_query;

posted @ 2018-03-30 14:34  会玩代码的摄影师  阅读(196)  评论(0编辑  收藏  举报