Ошибка курсора Oracle с оператором if - PullRequest
0 голосов
/ 04 июня 2018

Я получаю сообщение об ошибке, когда пытаюсь создать эту процедуру в пакетах.

FUNCTION SEARACH_FOR_GAMES (p_search_string in varchar2, p_match_type in number )
                             return weak_cur
  IS
    SEARCH_FIXID WEAK_CUR;   
  BEGIN  


    if p_match_type = 2
    then 
    OPEN   SEARCH_FIXID FOR
        select  FIXID, HOME,AWAY,COMP_NAME, M_TIME from SOCCER s
        where s.HOME LIKE (p_search_string) or s.AWAY LIKE (p_search_string)
        union all
        select  FIXID,HOME,AWAY,LISTS,M_TIME from BASKETBALLb
        where b.HOME LIKE (p_search_string) or b.AWAY LIKE (p_search_string)
        union all
        select FIXID,HOME,AWAY,COMP,M_TIME from HANDBALL h
        where h.HOME LIKE (p_search_string) or h.AWAY LIKE (p_search_string);
   elsif p_match_type = 1
    then
    OPEN   SEARCH_FIXID FOR
        select  FIXID,HOME,AWAY,COMP_NAME, TIME from LIVE_MATCHES_TZ s
        where s.HOME LIKE (p_search_string) or s.AWAY LIKE (p_search_string)
        union all
        select  FIXID,HOME,AWAY,COMP_NAME,TIME from LIVE_BASKETBALL_MATCHES b
        where b.HOME LIKE (p_search_string) or b.AWAY LIKE (p_search_string)
        union all
        select FIXID,HOME,AWAY,COMP_NAME,TIME from LIVE_HANDBALL_MATCHES h
        where h.HOME LIKE (p_search_string) or h.AWAY LIKE (p_search_string);
    end if;

    RETURN SEARCH_FIXID;
  END SEARACH_FOR_GAMES;

Я получаю две ошибки Обнаружен символ «IF» при ожидании одного из следующих действий и Обнаружен символ «конецфайл".Может быть из-за этого курсор?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Это

open cursorname for select...;

не

open cursorname;

for
    [...procedural logic...]

Так как мы можем положиться на оптимизатор, чтобы выдвинуть предикаты, подобные этому, в представление, я бы написал это примерно так:

create or replace function search_for_games
    ( p_search_string   in varchar2
    , p_match_type      in number )
    return sys_refcursor
is
    search_results sys_refcursor;
begin
    open search_results for
        select fixid, home, away, comp_name, m_time
        from   (
                 -- Type 0 matches:
                 select 0 as matchtype, fixid, home, away, comp_name, m_time from soccers
                 union all
                 select 0 as matchtype, fixid, home, away, comp_name, m_time from basketballb
                 union all
                 select 0 as matchtype, fixid, home, away, comp_name, m_time from handball h
                 union all
                 select 0 as matchtype, fixid, home, away, comp_name, m_time from ice_hockey i
                 union all
                 select 0 as matchtype, fixid, home, away, comp_name, m_time from tenis t
                 union all
                 select 0 as matchtype, fixid, home, away, comp_name, m_time from volleyball v
                 union all
                 -- Type 1 matches:
                 select 1 as matchtype, fixid, home, away, comp_name, m_time from table1
                 union all
                 select 1 as matchtype, fixid, home, away, comp_name, m_time from table2
               ) m
        where  m.matchtype = p_match_type
        and    ( m.home like p_search_string or m.away like p_search_string );

    return search_results;
end search_for_games;

Предложение where будет скопировано в отдельные разделы по мере необходимости.

Я не уверен, какую логику нужно реализовать с параметром p_match_type, но приведенная выше структура должнавсе равно начни.

0 голосов
/ 04 июня 2018

Должно быть так:

if p_match_type = 0 then
    OPEN SEARCH_FIXID FOR
    select  FIXID,HOME,AWAY,COMP_NAME, M_TIME 
    from SOCCERs
    where s.HOME LIKE (p_search_string) or s.AWAY LIKE (p_search_string)
        ...

Чтобы использовать курсор, вы должны проверить его с помощью

cur := PCK_BET.SEARACH_FOR_GAMES('xyz', 1);
IF cur%IS_OPEN THEN
    ...
ELSE
    -- No cursor opened
END ID;
...