Oracle简单学习

最近一段时间重温了oracle关于存储过程和oracle包以及function中的定义, 先看一下要用的表:

devices(id number, name varchar2, age number)

image

groups(id number, devicesid number, name varchar2, content varchar2)

image

在oracle中建立如下的package和package bodies,

image

下面给出里面具体的内容:

首先是packges下面的devices_pkg内容:

定义三个function和一个procedure

复制代码
CREATE OR REPLACE PACKAGE DEVICES_PKG
IS  
  
  TYPE MY_RESULTSET_CURSOR IS REF CURSOR;
  
  FUNCTION fun_add_device(
                     dev_id   NUMBER, 
                     dev_name VARCHAR2, 
                     dev_age  NUMBER)
  RETURN NUMBER;
 
  FUNCTION fun_delete_device(dev_id NUMBER)
  RETURN NUMBER;
  
  FUNCTION fun_Get_Test_Main_All
  RETURN MY_RESULTSET_CURSOR;
  
  PROCEDURE pro_select_device(dev_id NUMBER, RS out MY_RESULTSET_CURSOR);
  
END DEVICES_PKG;
复制代码

然后是packages bodies里面的内容:

这里面主要是对上面定义的function和procedure的实现定义,

有简单的返回, 还有游标类型的返回;

复制代码
CREATE OR REPLACE PACKAGE BODY DEVICES_PKG
AS

FUNCTION fun_add_device(dev_id NUMBER, 
                     dev_name VARCHAR2, 
                     dev_age NUMBER)
RETURN NUMBER
IS
BEGIN
    INSERT INTO devices VALUES (dev_id, dev_name, dev_age);
    IF SQL%FOUND THEN
       RETURN 1;
    ELSE
       RETURN 0;
    END IF;
END fun_add_device;


FUNCTION fun_delete_device(dev_id NUMBER)
RETURN NUMBER
IS 
BEGIN   
    DELETE FROM devices WHERE id = dev_id;
    IF SQL%FOUND THEN
       RETURN 1;
    ELSE
       RETURN 0;
    END IF;
END fun_delete_device;

FUNCTION fun_Get_Test_Main_All
RETURN MY_RESULTSET_CURSOR
IS
return_cursor MY_RESULTSET_CURSOR;
BEGIN
  OPEN return_cursor FOR 'SELECT d.id,d.name,d.age FROM devices d ORDER BY d.id ASC';
  RETURN return_cursor;
END;

PROCEDURE pro_select_device(dev_id NUMBER, RS out MY_RESULTSET_CURSOR)
IS
testCursor MY_RESULTSET_CURSOR;
testRec devices%ROWTYPE;
v_sql_select VARCHAR2(500);
BEGIN
  v_sql_select := 'select   
                  d.name, d.age, g.content
                  from devices d, groups g
                  where d.id ='|| dev_id ||
                  ' and d.id = g.devicesid';
  OPEN RS FOR v_sql_select;
  testCursor := fun_Get_Test_Main_All();
  LOOP
    FETCH testCursor INTO testRec;     
    EXIT WHEN testCursor%NOTFOUND;
    DBMS_OUTPUT.put_line('id:'||testRec.Id||',name:'||testRec.Name||',age:'||testRec.Age);
  END LOOP;
END;

END DEVICES_PKG;
复制代码

这里给出其中一个调用的过程:

image

测试devices_pkg.pro_select_device这个存储过程,

输入dev_id为3,

结果rs为:

image

然后看一下DBMS输出是什么:

image


posted on   努力做一个伪程序员  阅读(264)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
历史上的今天:
2018-11-10 表单验证<AngularJs>

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示