我编写了一个SQL函数,它接受一个参数并返回Table类型。
SQL函数 -
create or replace function get_some_data (p_val in number)
return my_tab_type_coll pipelined as
begin
FOR i in (select final_test_tb.*, PERIOD_BETWEEN_TWO_DATES(
FROM_TZ(CAST(from_date AS TIMESTAMP), 'UTC'),
FROM_TZ(CAST(to_date AS TIMESTAMP), 'UTC') as period
from (
select dl.id, dl.trip_id, dl.address, dl.from_date, dl.avg_speed, dl.high_speed,
case when tmp = 2 and nvl(lead(avg_speed) over (order by received_at asc), 1) = 0
then lead(to_date) over (order by received_at asc)
else to_date end to_date, tmp
from (
select test.*, case when avg_speed <> 0 then 1
when nvl(lag(avg_speed) over (order by received_at asc), 1) <> 0 then 2
when nvl(lead(avg_speed) over (order by received_at asc), 1) <> 0 then 3
end tmp
from test
where foo_id = p_val) dl
where tmp is not null) final_test_tb
where tmp in (1, 2)) loop
pipe row(my_tab_type(i.id, i.foo_id,
i.avg_speed, i.high_speed, i.distance, i.address_en, i.from_date, i.to_date));
end loop;
return;
end;
在这里,我已经创建了两种类型,即行类型 - my_tab_type&amp;表类型-my_tab_type_coll
使用sql command =&gt;
获取记录时select * from TABLE(get_some_data(10003));
是否可以从此功能构建rails模型? 这样,就可以为该模型/表格应用过滤器和分页。
答案 0 :(得分:1)
可能?是的......但可能是一个好主意? NO。
Active Record非常适合简单的表格。
SQL函数不是很好的匹配,可能更难与Active Record集成,然后只使用“execute” - 并迭代结果集。
这是一个可能对此有帮助的StackOverflow问题:Rails 3 execute custom sql query without a model
答案 1 :(得分:0)
我建议采用稍微不同的方法:而不是返回临时表&#34;而是使其成为真正的表,但添加一列:会话密钥或用户密钥。
如果表格存在,您可以创建模型。当您需要数据时,您还需要提供一个用户密钥&#39;或者&#39;会话密钥&#39;因此,多个会话可以在同一个表中计算内容,但不会相互干扰。
这样,imho,你可以充分利用这两个方面:你的函数可以动态计算数据,但它会插入一个表,它充当临时表,但仍然存在,因此你的模型可以依赖它。