收藏本站

人工智能培训机构,上海涛德,算法工程师,数据科学家高端培训机构-上海涛德

涛德数据科学培训原创:数据库技术:如何实现在SQL 查询中传入一个 另外一个 SQL ... ...

2014-5-28 00:16| 查看: 1262| 评论: 0

摘要: 涛德数据科学培训原创:数据库技术,如何实现在SQL 查询中传入一个 另外一个 SQL。这个技术在Oracle 的一本 Advanced PL/SQL课程由提到,但是不是很系统,于是做了下面这个例子,这个例子非常像 select * fro ... ...
作者:涛德OCM数据库讲师

OCM群里的一位同学今天问了一个有趣的问题,如何实现在SQL 查询中传入一个 另外一个 SQL。
这个技术在Oracle 的一本 Advanced PL/SQL课程由提到,但是不是很系统,于是做了下面这个例子,
这个例子非常像 select * from table(dbms_xplan.display()) 的操作。

另外:本例子在现实中用的非常少,纯属娱乐。

先定义一个 type  object
 create or replace type rec_order_items_type
 as object
 (order_id number (12),
 line_item_id number(3) ,
 product_id number(6),
 unit_price number(8,2),
 quantity number(8));
 /

创建package ,声明一个 ref cursor

create package cur_pack
as
type ref_cur_type is ref cursor;
end cur_pack;
/



创建一个table type,table的结构为 之前定义的rec_order_items_type 

create or replace type table_order_items_type
as table
of rec_order_items_type;
/



创建一个 函数,传入参数为之前的package的中的  “ref cursor” type ,返回类型为之前定义的 table type


create or replace function transform(inputrecs IN Cur_Pack.Ref_Cur_Type)
return table_order_items_type 
pipelined 
as
currec rec_order_items_type := rec_order_items_type ( null, null, null, null, null);
begin
      loop
         fetch inputrecs into currec.order_id,
                              currec.line_item_id,
                              currec.product_id,
                              currec.unit_price,
                              currec.quantity;
         exit when inputrecs%NOTFOUND;
         currec.product_id := currec.product_id + 100000;
         currec.unit_price := currec.unit_price / 100;
         currec.quantity := currec.quantity * 100;
         pipe row ( currec );
      end loop;
      close inputrecs;
      return;
end;
/

创建测试表

 create table order_items_ext (order_id number (12),
 line_item_id number(3) ,
 product_id number(6),
 unit_price number(8,2),
 quantity number(8));

e created.
插入测试数据
 insert into order_items_ext values(1,2,3,4,5);



执行SQL查询,利用table函数和cursor函数就能实现在SQL中再次传入SQL“select * from order_items_ext

select *
from table
       (transform
         (cursor
           (select * from order_items_ext)));




<点击:上海涛德Oracle OCM认证及BI商业智能课程>|人工智能培训-上海涛德 ( 沪ICP备14006824号 )|网站地图   My title page contents

GMT+8, 2018-11-13 07:36 , Processed in 0.106462 second(s), 14 queries , Gzip On.

回顶部