Oracle简单学习

Posted 努力做一个伪程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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


以上是关于Oracle简单学习的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Toad for Oracle 中使用自定义代码片段?

golang代码片段(摘抄)

Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)(代码片段

Python学习总结

Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段

为啥这段代码会泄露? (简单的代码片段)