【急】请教在oraqcle10g的function中动态创建视图,并返回集合的问题

cc_user 2016-07-19 09:50:04
兄弟们好
在这请教一下oraqcle10g的function中动态创建视图,并返回集合的方法;
现在有个需求:
1、按月有表,比如TAB_DATA_201601、TAB_DATA_201602 、......、TAB_DATA_201612;
2、提供一个统一接口,给其他人调用,返回相应数据,不必给出这么多表;
3、简单的创建VIEW,担心效率和往后维护问题。

问题是,我依照下面的方法这么做,行不通。

--比如使用以下语句,返回的都是第一句SQL执行的结果,
--而不是根据日期参数返回。
SELECT * FROM TABLE(TAB_CDR(201604));
SELECT * FROM TABLE(TAB_CDR(201605));
......
SELECT * FROM TABLE(TAB_CDR(201612));

下面这个修改一下即可呢,还是选择其他什么办法,还请不吝赐教。
以下是我的想法和实践:

--1 创建集合类型
CREATE OR REPLACE TYPE type_event_o AS OBJECT (nbr VARCHAR2(32),
ms VARCHAR2(15),startdate DATE,send NUMBER(12),recv NUMBER(12),
duration NUMBER(12),CYCLE_id NUMBER(9));

CREATE OR REPLACE TYPE type_event_t AS TABLE OF type_event_o;

--2 创建函数
CREATE OR REPLACE FUNCTION TAB_CDR (cycle_id NUMBER)
RETURN type_event_t PIPELINED
AS
v_sql VARCHAR2(500);
cdr_row1 type_event_o;
BEGIN
v_sql := 'create or replace view v_tc_data as
select nbr,ms,startdate,send,recv,
duration,CYCLE_id from TAB_DATA_'|| CYCLE_ID ||
' WHERE CNT>0';
EXECUTE IMMEDIATE v_sql;

for cdr_rows IN (select * from v_tc_data )
LOOP
cdr_row1 := type_event_o(cdr_rows.nbr,cdr_rows.ms,cdr_rows.startdate,
cdr_rows.send,cdr_rows.recv,
cdr_rows.duration,cdr_rows.CYCLE_id);
PIPE ROW (cdr_row1);
END LOOP;
RETURN ;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line('err');
END TAB_CDR;

--3 具体使用
SELECT * FROM TABLE(TAB_CDR(201606));

...全文
127 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
cc_user 2016-07-19
  • 打赏
  • 举报
回复
自己顶一下~,谢谢!

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧