2015-06-21 32 views
-1

我寫了一個SQL函數,它接受一個參數並返回Table類型。從原始sql查詢聲明Rails模型

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 &表型-my_tab_type_coll

在拿使用SQL命令的記錄=>

select * from TABLE(get_some_data(10003)); 

是否可以使用此功能構建導軌模型? 因此,可以爲該模型/表應用過濾器和分頁。

+0

顯示該功能。 –

+0

@SergioTulentsev - 請檢查。我添加了SQL函數,它返回Table類型。 – kd12

+0

我不明白如何通過一個原始的'return;'返回一個函數。那是那個奇怪的SQL,還是隻是我?重點是:嘗試構建最簡單的可能的函數,返回一些明顯的東西。在這之上工作要容易得多。然後,您可以用更高級的東西替換該簡單的功能並應用建議的解決方案。 –

回答

1

可能嗎?是的......但可能是一個好主意?沒有。

活動記錄是一個簡單表格的很好匹配。

SQL函數不是很好的匹配,並且可能很難與Active Record集成,然後使用「執行」 - 並迭代結果集。

這裏有一個StackOverflow的問題,可能與幫助:Rails 3 execute custom sql query without a model

+1

可能基於_that_上的模型?我想知道如何。 –

+0

是的,謝謝@Taryn東!!目前,我正在使用與使用sql函數相同的方式。 – kd12

+0

@SergioTulentsev不,你真的不會;)如果我被迫找到一種方法 - 我可能會使用活動模型,而不是活動記錄......但你必須拖我踢,尖叫才能做到這一點。 –

0

我建議稍微不同的方法:而不是返回一個「臨時表」,而不是使之成爲真正的表,但添加一列:會話鍵或用戶鍵。

如果表格剛好存在,您可以創建模型。當你需要這些數據時,你還會給出一個'用戶鍵'或'會話鍵',這樣多個會話可以計算同一個表中的內容,但不會互相干擾。這樣你就可以得到兩全其美的效果:你的函數可以即時計算數據,但是它會插入一個表中,該表充當臨時表,但是仍然存在,所以你的模型可以依靠它。

+0

此解決方案是否會影響應用程序性能? 使用sql函數,我可以通過連接「execute」得到結果,但沒有活動記錄模型。 – kd12

+0

使用存儲過程(函數)填充數據,使用活動記錄來讀取它。性能應該幾乎類似於imho。你可能會有一點性能損失,但你會有更多的程序員幸福:) – nathanvda