2014-01-24 2 views
1

Я новичок в этой группе. Я пытался думать о том, чтобы иметь курсор с выражением выбора условия. Некоторые, как, как этот псевдо code--Oracle Cursor with conditional Оператор Select

[B]cursor test_cursor is 
    if condition == 't11' 
    then 
    select * from test1; 
    else 
    select * from test1; 
    end if;[/B] 
begin 

    for cursorVal in test_cursor loop 
    //Doing the actual task on cursor data. 
    end loop; 

commit; 
end; 

На самом деле, я наткнулся со сценарием, где нужно работать на двух разных таблиц с одинаковым DDL. Основываясь на некотором пользовательском вводе, необходимо извлечь данные из любой таблицы и далее манипулировать процедурой. Как я сказал, обе таблицы имеют один и тот же DDL , поэтому не хотите создавать два разных курсора. Причина для этой же бизнес-логики будет применяться к обеим табличным данным. Его просто пользовательский ввод, который решает, какая таблица должна извлекать данные. Некоторые из них могут думать об этом как о последних данных и исторических данных, так и о том, как создается БД.

Надеюсь, что я понятен в своем сценарии.

Thanks, Arfeen.

+1

Итак, в чем ваш вопрос? –

+0

Используйте динамический SQL. См. Http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm#LNPLS011 – Rachcha

+0

Использование курсора ref может решить вашу проблему, на основе пользовательских входов вы можете открыть этот курсор для нужной таблицы. – San

ответ

1

Курсор может быть объявлен как объединение, как описано ниже. В зависимости от содержимого переменной condition курсор будет либо основан на Test1, либо Test2.

SELECT * FROM Test1 WHERE condition = 't1' 
UNION ALL 
SELECT * FROM Test2 WHERE condition = 't2' 
0

То, что вы пытаетесь достичь, похоже, может либо быть достигнуто за счет улучшения таблицы или представления конструкции или с помощью BULK COLLECT. Если вы можете - всегда рассматривайте дизайн базы данных сначала над кодом.

BEGIN 

if condition == 't11' then 
SELECT XXXXXX 
BULK COLLECT INTO bulk_collect_ids 
FROM your_table1; 
else 
SELECT XXXXXX 
BULK COLLECT INTO bulk_collect_ids 
FROM your_table2; 
end if; 

FOR indx IN 1 .. bulk_collect_ids.COUNT 
LOOP 
. 
//Doing the actual task on bulk_collect_ids data. 
. 
END LOOP; 

END;