Oracle динамически вызывать курсор - PullRequest
1 голос
/ 14 октября 2019

У меня два курсора, оба имеют почти одинаковый код, только небольшая разница в группе по условию, я хочу, чтобы идентификатор был 1 или 2 и т. Д., Тогда он должен открывать cur1, иначе cur2, в основном один курсор за раз. Есть ли возможность достичь этого?

if id in (1,2,3,4) then
  cursor_value:= 'cur1';
else
  cursor_value := 'cur2';
end if;


for i in cursor_value loop

end loop;

Ответы [ 3 ]

3 голосов
/ 14 октября 2019

Вы можете использовать оператор OPEN-FOR. Пример:

DECLARE
  TYPE EmpCurTyp  IS REF CURSOR;
  v_emp_cursor    EmpCurTyp;
  emp_record      employees%ROWTYPE;
  v_stmt_str      VARCHAR2(200);
  v_e_job         employees.job%TYPE;
BEGIN
  -- Dynamic SQL statement with placeholder:
  v_stmt_str := 'SELECT * FROM employees WHERE job_id = :j';

  -- Open cursor & specify bind argument in USING clause:
  OPEN v_emp_cursor FOR v_stmt_str USING 'MANAGER';

  -- Fetch rows from result set one at a time:
  LOOP
    FETCH v_emp_cursor INTO emp_record;
    EXIT WHEN v_emp_cursor%NOTFOUND;
  END LOOP;

  -- Close cursor:
  CLOSE v_emp_cursor;
END;
/
1 голос
/ 14 октября 2019

Простым способом может быть использование условия if else.

DECLARE 
type cur REF CURSOR;
c cur;
BEGIN 
   IF id in (1,2,3,4) THEN 
     OPEN c FOR 'cursor query 1'; 
   ELSE 
     OPEN c FOR 'cursor query 2';
 END IF ; 
END; 

Cheers !!

1 голос
/ 14 октября 2019

Одним из вариантов будет включение обоих операторов курсора SELECT в цикл курсора FOR вместе с условием, которое выбирает, какой из них будет использоваться. Например:

SQL> declare
  2    id number := &par_id;
  3  begin
  4    for cur_r in (select * from emp
  5                  where deptno = 10
  6                    and id in (1,2,3,4)
  7                  union all
  8                  select * from emp
  9                  where deptno = 20
 10                    and id not in (1,2,3,4)
 11                 )
 12    loop
 13      dbms_output.put_Line(cur_r.deptno ||' '||cur_r.ename);
 14    end loop;
 15  end;
 16  /
Enter value for par_id: 1               --> ID = 1, so use SELECT for DEPTNO = 10
old   2:   id number := &par_id;
new   2:   id number := 1;
10 CLARK
10 KING
10 MILLER

PL/SQL procedure successfully completed.

SQL> /
Enter value for par_id: 823             --> ID <> 1, so use SELECT for DEPTNO = 20
old   2:   id number := &par_id;
new   2:   id number := 823;
20 SMITH
20 JONES
20 SCOTT
20 ADAMS
20 FORD

PL/SQL procedure successfully completed.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...