Oracle PLSQL устанавливает курсор из переменной - PullRequest
2 голосов
/ 27 июля 2010

Я новичок в курсорах в Oracle. У меня есть кусок SQL, который содержится в переменной. Я хочу, чтобы открыть курсор с этим sql. Как мне это сделать? Кажется простым, но все примеры, которые я нахожу, имеют SQL, набранный непосредственно под оператором «имя открытого курсора для».

Вот что я хотел бы запустить (предположим, у меня есть переменная v_sql с моим запросом sql):

open my_cursor for v_sql;

Оракулу это не нравится. Я тоже пробовал

open my_cursor for 
  execute immediate v_sql;

Помогите пожалуйста.

Ответы [ 3 ]

5 голосов
/ 27 июля 2010

Вам необходимо объявить его как курсор-указатель, а затем открыть его для вашего оператора SQL.Пожалуйста, посмотрите на пример ниже.Это, конечно, предполагает, что у вас нет входных привязок к вашему sql.

sql> ed
Wrote file afiedt.buf

  1  declare
  2     c1 sys_refcursor;
  3     v_empno number;
  4     v_ename varchar2(30);
  5  begin
  6    open c1 for 'select empno, ename from emp';
  7    loop
  8      fetch c1 into v_empno, v_ename;
  9      dbms_output.put_line(v_empno || '--' || v_ename);
 10      exit when c1%notfound;
 11    end loop;
 12    close c1;
 13* end;
sql> /
7369--SMITH
7499--ALLEN
7521--WARD
7566--JONES
7654--MARTIN
7698--BLAKE
7782--CLARK
7788--SCOTT
7839--KING
7844--TURNER
7876--ADAMS
7900--JAMES
7902--FORD
7934--MILLER
7934--MILLER

Проверьте эту ссылку ... http://download.oracle.com/docs/cd/B14117_01/appdev.101/b10807/11_dynam.htm#i13057

1 голос
/ 27 июля 2010

Первый ваш фрагмент будет работать нормально, если v_sql является VARCHAR, а my_cursor объявлен как REF CURSOR. Затем вы можете ПОЛУЧИТЬ это, как если бы вы использовали статический курсор.

Но, как говорит OMG Ponies, вы должны быть осторожны с тем, откуда приходит ваш SQL.

0 голосов
/ 28 июля 2010

OMG Ponies совершенно правильно,

, но здесь есть просто другой способ сделать то же самое

Var X Refcursor;
Begin
Open :X For
   Select 1 Num, 'b' Co
    From Dual
    Union
   Select 2 Num, 'c' Co
    From Dual;

end;

/
print x;

Обратите внимание, когда вы делаете что-то в Oracle, например, открывая курсоры или еще что-нибудьдолжно быть в пределах НАЧАЛА / КОНЦА, и вы не можете просто сделать:

Var X Refcursor;
Open X For
   Select 1 Num, 'b' Co
    From Dual
    Union
   Select 2 Num, 'c' Co
    From Dual;

Это не будет работать!Вы должны заключить курсор OPEN в блок BEGIN / END (будь то автономный блок или процедура ...)

Create or replace Procedure Ccc(X Out sys_Refcursor) 
As
begin
Open X For
   Select 1 Num, 'b' Co
    From Dual
    Union
   Select 2 Num, 'c' Co
    From Dual;
End Ccc;
/

Var X Refcursor;
Begin
Ccc(:X);
End;
/
print x;

обратите внимание: x в начале / конце в автономных блоках означаетдвижок sql вы используете переменную, созданную вне блока.в пакетах / процессах это не нужно.

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