zoukankan      html  css  js  c++  java
  • 利用函数返回结果集

    利用函数返回结果集方法总结

    返回结果集函数可以将变量值传递给函数得到指定的结果集,优点在于灵活控制结果集变量及输出,不用将sql嵌入到页面代码里,业务逻辑如有更改可以直接在数据库中维护。

    现总结三种方法:OBJECT TYPE、OBJECT TYPE+PIPE ROW、RECORD+PIPE ROW

    OBJECT TYPE

    TYPE定义

    create type tp_obj_emp as object(

    empno NUMBER(4),

    ename VARCHAR2(10),

    job VARCHAR2(9),

    mgr NUMBER(4),

    hiredate DATE,

    sal NUMBER(7,2),

    comm NUMBER(7,2),

    deptno NUMBER(2)

    )

    create type tp_tab_emp is table of tp_obj_emp;

    函数定义

    create or replace function f_test_record(p_deptno number) return tp_tab_emp as

    v_tab tp_tab_emp;

    begin

    select tp_obj_emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)

    bulk collect

    into v_tab

    from emp

    where deptno = p_deptno;

    return v_tab;

    end;

    调用

    SQL> select * from table(f_test_record(10));

     

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

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

    7782 CLARK MANAGER 7839 09-6月 -81 2450 10

    7839 KING PRESIDENT 17-11月-81 5000 10

    7934 MILLER CLERK 7782 23-1月 -82 1300 10

     

    已用时间: 00: 00: 00.01

    OBJECT TYPE+PIPE ROW

    TYPE定义

    create type tp_obj_emp as object(

    empno NUMBER(4),

    ename VARCHAR2(10),

    job VARCHAR2(9),

    mgr NUMBER(4),

    hiredate DATE,

    sal NUMBER(7,2),

    comm NUMBER(7,2),

    deptno NUMBER(2)

    )

    create type tp_tab_emp is table of tp_obj_emp;

     

    函数定义

    create or replace function f_test_record_pipe(p_deptno number)

    return tp_tab_emp

    pipelined as

    v_obj tp_obj_emp;

    begin

    for cur in (select * from emp where deptno = p_deptno) loop

    v_obj := tp_obj_emp(cur.empno,

    cur.ename,

    cur.job,

    cur.mgr,

    cur.hiredate,

    cur.sal,

    cur.comm,

    cur.deptno);

    pipe row(v_obj);

    end loop;

    end;

    调用

    SQL> select * from table(f_test_record_pipe(10));

     

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

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

    7782 CLARK MANAGER 7839 09-6月 -81 2450 10

    7839 KING PRESIDENT 17-11月-81 5000 10

    7934 MILLER CLERK 7782 23-1月 -82 1300 10

     

    已用时间: 00: 00: 00.01

    RECORD+PIPE ROW

    定义包

    create or replace package pkg_pipe_test as

     

    type t_rec_emp is record(

    empno number(4),

    ename varchar2(10),

    job varchar2(9),

    mgr number(4),

    hiredate date,

    sal number(7, 2),

    comm number(7, 2),

    deptno number(2));

     

    type t_tab_emp is table of t_rec_emp;

     

    function f_test_record_pipe_noc(p_deptno number) return t_tab_emp

    pipelined;

     

    end;

     

    create or replace package body pkg_pipe_test is

     

    function f_test_record_pipe_noc(p_deptno number) return t_tab_emp

    pipelined as

    v_rec t_rec_emp;

    begin

    for cur in (select * from emp where deptno = p_deptno) loop

    v_rec.empno := cur.empno;

    v_rec.ename := cur.ename;

    v_rec.job := cur.job;

    v_rec.mgr := cur.mgr;

    v_rec.hiredate := cur.hiredate;

    v_rec.sal := cur.sal;

    v_rec.comm := cur.comm;

    v_rec.deptno := cur.deptno;

    pipe row(v_rec);

    end loop;

    end;

     

    end;

    调用

    SQL> select * from table(pkg_pipe_test.f_test_record_pipe_noc(10));

     

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

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

    7782 CLARK MANAGER 7839 09-6月 -81 2450 10

    7839 KING PRESIDENT 17-11月-81 5000 10

    7934 MILLER CLERK 7782 23-1月 -82 1300 10

     

    已用时间: 00: 00: 00.01

    总结

    对于OBJECT TYPE和OBJECT TYPE+PIPE ROW的方法需要在数据库里定义OBJECT TYPE而RECORD+PIPE ROW需要在包内定义RECORD类型。

  • 相关阅读:
    less学习二---变量
    less学习一
    canvas+javascript实现淘宝商品放大镜效果
    webstorm报错Unescaped xml character解决方案1
    javascript getBoundingClientRect()获取元素四个边相对于窗口或文档的位置
    chorme浏览器不支持audio/video中的autoplay属性的解决方法
    html5中audio支持音频格式
    每天一个JS 小demo之通过事件委托实现菜单展开及选中特效。主要知识点:事件
    每天一个JS 小demo之滑屏幻灯片。主要知识点:event
    每天一个JS 小demo之“拖拽”效果的实现。主要知识点:event
  • 原文地址:https://www.cnblogs.com/mellowsmile/p/5639445.html
Copyright © 2011-2022 走看看