从原始sql查询

时间:2015-06-21 07:26:37

标签: sql ruby-on-rails

我编写了一个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模型? 这样,就可以为该模型/表格应用过滤器和分页。

2 个答案:

答案 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,你可以充分利用这两个方面:你的函数可以动态计算数据,但它会插入一个表,它充当临时表,但仍然存在,因此你的模型可以依赖它。