zoukankan      html  css  js  c++  java
  • oracle表函数使用table function

    # 创建object type

    create or replace type udt is object(c1 varchar2(100), c2 varchar2(100));
    /

    # 使用object type定义嵌套表

    create or replace type nt is table of udt;
    /

    # 用嵌套表做函数的返回值类型

    create or replace function my_func(var varchar2) return nt is
    result_set nt := nt();
    begin
    result_set.extend();
    result_set(1) := udt(1+var,1-var);
    result_set.extend();
    result_set(2) := udt(10+var,10-var);
    return result_set;
    end;
    //

    # table function的几种调用方法
    SELECT c.c1 FROM TABLE(my_func(15)) c;


    SELECT c.c1 FROM TABLE(select my_func(15) from dual) c;

    declare
      result varchar2(100);
      v_ret varchar2(100) := 15;
      v_sql varchar2(1000);
      udc sys_refcursor;
    begin
      v_sql := 'SELECT C.c1 value FROM TABLE(my_func(' || v_ret || ')) C';

      OPEN udc FOR v_sql;
      loop
        fetch udc into result;
        exit when udc%notfound;
        dbms_output.put_line(result);
      end loop;
    end;
    /

    整理table的几种用法:

    PL/SQL表---table()函数用法:
    利用table()函数,我们可以将PL/SQL返回的结果集代替table。
    
    oracle内存表在查询和报表的时候用的比较多,它的速度相对物理表要快几十倍。
    
    simple example:
    
    1、table()结合数组:
    
    */
    
    create or replace type t_test as object(
    id integer,
    rq date,
    mc varchar2(60)
    );
    
    create or replace type t_test_table as table of t_test;
    
    create or replace function f_test_array(n in number default null) return t_test_table
    as
    v_test t_test_table := t_test_table();
    begin
    for i in 1 .. nvl(n,100) loop
    v_test.extend();
    v_test(v_test.count) := t_test(i,sysdate,'mc'||i);
    end loop;
    return v_test;
    end f_test_array;
    /
    
    select * from table(f_test_array(10));
    
    select * from the(select f_test_array(10) from dual);
    
    /*
    
    2、table()结合PIPELINED函数:
    
    */
    
    create or replace function f_test_pipe(n in number default null) return t_test_table PIPELINED
    as
    v_test t_test_table := t_test_table();
    begin
    for i in 1 .. nvl(n,100) loop
    pipe row(t_test(i,'mc'||i));
    end loop;
    return;
    end f_test_pipe;
    /
    
    select * from table(f_test_pipe(20));
    
    select * from the(select f_test_pipe(20) from dual);
    
    /*
    
    3、table()结合系统包:
    
    */
    
    create table test (id varchar2(20));
    insert into test values('1');
    commit;
    explain plan for select * from test;
    select * from table(dbms_xplan.display);
    
    PL/SQL表---table()函数用法
    /*
  • 相关阅读:
    Android热补丁动态修复
    Android用gif做启动页
    如果通过adb查看当前显示的activity
    Android网络框架比较
    Android高清巨图加载方案
    一些Windows下经验
    工作总结
    C++网络编程总结
    编写导出库
    GridCtrl控件的使用
  • 原文地址:https://www.cnblogs.com/quzq/p/14308768.html
Copyright © 2011-2022 走看看