2015-10-12 35 views
1

我在執行存儲過程以取回結果時遇到問題。目前,我想在toadeclipse的輸出窗口中顯示結果,或者我將要使用的任何其他結果。稍後,我想從程序中訪問它們。現在忽略程序部分,除非它是必需的。從存儲過程或函數獲取結果

我有這個存儲過程的代碼:

create or replace procedure pottyuserange (p_date_format in varchar2, 
             p_start_date in varchar2, 
             p_end_date in varchar2, 
             p_ref_cursor out sys_refcursor) 
as 
begin 
    open p_ref_cursor for 
    select to_char(time_range, p_date_format) as current_date, 
     lm_search, 
     ao_search, 
     ro_search, 
     fl_search, 
     total 
from  (select trunc(time_range) time_range, 
        sum(case when porta_potty = 'LM' then 1 else 0 end) as lm_search, 
        sum(case when porta_potty = 'AO' then 1 else 0 end) as ao_search, 
        sum(case when porta_potty = 'RO' then 1 else 0 end) as ro_search, 
        sum(case when porta_potty = 'FL' then 1 else 0 end) as fl_search, 
        sum(case when porta_potty in ('LM', 'AO', 'RO', 'FL') then 1 else 0 end) as total   
      from  core.date_test 
      where trunc(time_range) >= to_date(p_start_date, p_date_format) 
      and  trunc(time_range) <= to_date(p_end_date, p_date_format) 
      group by trunc(time_range)) 
    order by time_range asc; 
    end pottyuserange; 
/

而且我試圖得到這樣的結果:

variable rc refcursor; 

BEGIN 
    pottyuserange('YYYY-MM-DD', '2008-10-1', '2010-10-12', :rc); 
END; 

print rc; 

這是我得到的錯誤:

ORA-01722: invalid number 
ORA-06512: at "core.pottyuserange", line 4 
ORA-06512: at line 1 

我該如何正確地訪問這些數據,或將它變成User-Defined Function? \

這是我在把它變成一個功能的嘗試:

create or replace function pottyuserange (p_date_format in varchar2, 
             p_start_date in varchar2, 
             p_end_date in varchar2) 
return result_set as rc sys_refcursor; 

BEGIN 

OPEN result_set FOR 
    select to_char(time_range, p_date_format) as current_date, 
     lm_search, 
     ao_search, 
     ro_search, 
     fl_search, 
     total 
from  (select trunc(time_range) time_range, 
        sum(case when porta_potty = 'LM' then 1 else 0 end) as lm_search, 
        sum(case when porta_potty = 'AO' then 1 else 0 end) as ao_search, 
        sum(case when porta_potty = 'RO' then 1 else 0 end) as ro_search, 
        sum(case when porta_potty = 'FL' then 1 else 0 end) as fl_search, 
        sum(case when porta_potty in ('LM', 'AO', 'RO', 'FL') then 1 else 0 end) as total   
      from  core.date_test 
      where trunc(time_range) >= to_date(p_start_date, p_date_format) 
      and  trunc(time_range) <= to_date(p_end_date, p_date_format) 
      group by trunc(time_range)) 
    order by time_range asc; 
    return result_set; 
    end pottyuserange; 
/

我與上面得到的錯誤是:PLS-00201: identifier 'RESULT_SET' must be declared

編輯TIME_RANGEDATEPORTA_POTTY是一個varchar2。

+0

,然後創建一個用戶定義的函數,而不是一個存儲過程。 –

+0

我更新了問題。我將如何將其轉換爲用戶定義的函數?我一直在擺弄這個,但我沒有運氣。我會用我試過的東西來更新這篇文章。 –

+1

涉及的數據類型是什麼?除非您的代碼正在進行某種隱式轉換,否則您得到的錯誤似乎沒有多大意義。但是這種轉換不會是明顯的。我猜''time_range'是'date' –

回答

1

(方法1)創建自己的集合類型(S)和變化函數返回此類型的對象:

create or replace type tp_potty as object (
    current_date varchar2(20), lm_search number(6), ao_search number(6), 
    ro_search number(6), fl_search number(6), total number(6)); 

create or replace type tp_potty_tbl as table of tp_potty; 

create or replace function pottyuserange (p_date_format in varchar2, 
              p_start_date in varchar2, 
              p_end_date in varchar2) 
            return tp_potty_tbl is 
    potty_tbl tp_potty_tbl; 
begin 
    select cast(multiset(
     select to_char(time_range, p_date_format) as current_date, 
      lm_search, ao_search, ro_search, fl_search, total 
     from (select trunc(time_range) time_range, 
         sum(case when porta_potty = 'LM' then 1 else 0 end) lm_search, 
         sum(case when porta_potty = 'AO' then 1 else 0 end) ao_search, 
         sum(case when porta_potty = 'RO' then 1 else 0 end) ro_search, 
         sum(case when porta_potty = 'FL' then 1 else 0 end) fl_search, 
         sum(case when porta_potty in ('LM', 'AO', 'RO', 'FL') 
           then 1 else 0 end) total 
       from  date_test 
       where trunc(time_range) >= to_date(p_start_date, p_date_format) 
       and  trunc(time_range) <= to_date(p_end_date, p_date_format) 
       group by trunc(time_range)) 
     order by time_range asc) as tp_potty_tbl) into potty_tbl from dual; 
    return potty_tbl; 
end pottyuserange; 

現在運行:

select * from table(pottyuserange('yyyy-mm-dd', '2015-10-10', '2015-10-15')) 

CURRENT_DATE   LM_SEARCH AO_SEARCH RO_SEARCH FL_SEARCH TOTAL 
-------------------- --------- --------- --------- --------- ------- 
2015-10-12     1   0   0   0  1 
2015-10-13     1   0   0   0  1 
2015-10-14     0   0   0   0  0 

(方法2)從PL/SQL塊中的函數返回的遊標列表輸出如下:

create or replace function potty2 (p_date_format in varchar2, 
    p_start_date in varchar2,p_end_date in varchar2) return sys_refcursor is 

    result_set sys_refcursor; 

BEGIN 

OPEN result_set FOR 
    select to_char(time_range, p_date_format) as current_date, 
     lm_search, ao_search, ro_search, fl_search, total 
from  (select trunc(time_range) time_range, 
        sum(case when porta_potty = 'LM' then 1 else 0 end) as lm_search, 
        sum(case when porta_potty = 'AO' then 1 else 0 end) as ao_search, 
        sum(case when porta_potty = 'RO' then 1 else 0 end) as ro_search, 
        sum(case when porta_potty = 'FL' then 1 else 0 end) as fl_search, 
        sum(case when porta_potty in ('LM', 'AO', 'RO', 'FL') 
          then 1 else 0 end) as total   
      from  date_test 
      where trunc(time_range) >= to_date(p_start_date, p_date_format) 
      and  trunc(time_range) <= to_date(p_end_date, p_date_format) 
      group by trunc(time_range)) 
    order by time_range asc; 
    return result_set; 
end potty2; 

PL/SQL塊:

declare 
    cur sys_refcursor; 
    v1 varchar2(20); v2 number(6); v3 number(6); v4 number(6); v5 number(6); v6 number(6); 
begin 
    cur := potty2('yyyy-mm-dd', '2015-10-10', '2015-10-15'); 
    loop 
    fetch cur into v1, v2, v3, v4, v5, v6; 
    exit when cur%notfound; 
    dbms_output.put_line(v1||' '||v2||' '||v3||' '||v4||' '||v5||' '||v6); 
    end loop; 
    close cur; 
end; 

我的答案是基於這篇文章:PL/SQL 101 : Understanding Ref Cursors,如果你想在結果窗口結果

+0

謝謝。我實際上在幾天前解決了這個問題,但忘了發佈更新。問題是日期格式被錯誤地解析。明天,如果這有效,我會告訴你。 –