powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Декларация курсора в user type
25 сообщений из 72, страница 1 из 3
Декларация курсора в user type
    #39482991
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Возможно ли представить курсор как поле объекта

А именно
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace type ttAA as object
(
  gencurtyp REF CURSOR,   - !!!!  ЗДЕСЬ !!!!
  A integer,

  constructor function ttAA(DBEG DATE
                           ) return self as result,

  constructor function ttAA(DBEG DATE,
                            DEND DATE
                           ) return self as result,
   member function Show return integer
)



Пакетные решения мне известны
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE PACKAGE admin_data AS
   TYPE gencurtyp IS REF CURSOR;
   PROCEDURE open_cv (generic_cv IN OUT gencurtyp, choice INT);
END admin_data;
/
CREATE PACKAGE BODY admin_data AS
   PROCEDURE open_cv (generic_cv IN OUT gencurtyp, choice INT) IS
   BEGIN
      IF choice = 1 THEN
         OPEN generic_cv FOR SELECT * FROM employees;
      ELSIF choice = 2 THEN
         OPEN generic_cv FOR SELECT * FROM departments;
      ELSIF choice = 3 THEN
         OPEN generic_cv FOR SELECT * FROM jobs;
      END IF;
   END;
END admin_data;
/



Благодарен за решение в PL/SQL коде
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483002
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XВозможно ли представить курсор как поле объектаВ SQL нет типа данных "курсор".
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483044
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Принято !

Хотел реализовать
В конструктор передали 1 параметр - задекла-ся курсор со скриптом N1 с переданным параметром
В конструктор передали 2 параметра - задекла-ся курсор со скриптом N2 c переданными параметром
Функция Show открыла этот курсор, просканила его вернула pipelined (возвращаемый тип идентичен)

Какое возможно ПРОСТОЕ И ИЗЯЩНОЕ решение ?

Напрашивается
1. Два конструктора создают длинную строку SQL скрипта, пишу в String поле, использую далее в курсоре
2. Резервирование полей для параметров обеих типов конструктора, далее анализ какой тип конструктора
был вызван, декларация соответствующего курсора в функции Show (параметров штук 20)

Ваши предложения ?

Спасибо
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483086
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XВаши предложения ?Не надо за уши притягивать измышлизмы.
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483121
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XВаши предложения ?
Если версия 11g, то можешь попробовать создать поле типа cursor_id и потом работать с ним через dbms_sql.to_refcursor.
Если версия 12c, то можешь посмотреть в сторону dbms_sql.return_result и реализовать метод, который возвращает implicit result set.
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483238
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Вашу мысль понял Вас, где src_cur - поле объекта


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Constructor
  curid      := DBMS_SQL.OPEN_CURSOR;
  sql_stmt := 'select 1 А1 from DUAL';
  DBMS_SQL.PARSE(curid, sql_stmt, DBMS_SQL.NATIVE);
  src_cur   := DBMS_SQL.TO_REFCURSOR(curid);
...........

function Show
  FETCH src_cur BULK COLLECT INTO empnos, depts;
...............



Вопрос как извлечь id cursora (curid) при такой декларации
declare
cursor Q1 is select 1 F1 from DUAL union all select 2 F1 from DUAL;
begin
......
end

Писать текст (sql_stmt := 'select 1 А1 from DUAL';)
в моем случае неудобно.

Заранее благодарен !
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483250
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку Вы хотите "курсор как поле объекта" (т.е. типа member variable), а не "Тип <КУРСОР> как поле объекта", то напрашивается ето:
HOME_X
Код: plsql
1.
2.
3.
4.
5.
6.
create or replace type ttAA as object
(
  gencurtyp sys_refcursor,   - !!!!  ЗДЕСЬ !!!!

[...]
)

так?
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483253
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XВозможно ли представить курсор как поле объектаДля чего?
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483255
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВ SQL нет типа данных "курсор".
Он вроде бы как бы и есть

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select cursor(select * from dual) cur
from dual
connect by level <= 2;

CUR
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

D
-
X

CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

D
-
X


а вроде бы как бы и нет

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select *
from
   (select cursor(select * from dual) cur
    from dual
    connect by level <= 2
    );
   (select cursor(select * from dual) cur
           *
ошибка в строке 3:
ORA-22902: выражение CURSOR не разрешено


Затрач.время: 00:00:00.01

select dump(cursor(select * from dual)) dcur
from dual
connect by level <= 2;
select dump(cursor(select * from dual)) dcur
            *
ошибка в строке 1:
ORA-22902: выражение CURSOR не разрешено
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483257
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadДля чего?если ТС и в пакетах использует совершенно ненужную конструкцию TYPE gencurtyp IS REF CURSOR, то что-то мне подсказывает, что он не вкурсе, что такое SYS_REFCURSOR..
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483265
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в 12 ето можно делать?

PLS-00989: Cursor Variable in record, object, or collection is not supported by this release
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483268
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--AmKadДля чего?если ТС и в пакетах использует совершенно ненужную конструкцию TYPE gencurtyp IS REF CURSOR, то что-то мне подсказывает, что он не вкурсе, что такое SYS_REFCURSOR..

если чесно, то я тож разницу не знаю (кроме удобства)

.....
stax
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483270
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Поскольку Вы хотите "курсор как поле объекта" (т.е. типа member variable), а не "Тип <КУРСОР> как поле объекта", то напрашивается ето:
HOME_X
Код: plsql
1.
2.
3.
4.
5.
6.
create or replace type ttAA as object
(
  gencurtyp sys_refcursor,   - !!!!  ЗДЕСЬ !!!!

[...]
)

так?

gencurtyp sys_refcursor,
и что так возможно ?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace type ttAA as object
(
  gencurtyp sys_refcursor,

  A integer,

  constructor function ttAA(DBEG DATE
                           ) return self as result,

  constructor function ttAA(DBEG DATE,
                            DEND DATE
                           ) return self as result,
   member function Show return integer
)
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483272
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

Пояснение вышеизложено, для передачи указателя на курсор между методами
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483273
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xпри такой декларацииВероятно тебе сначала стоит узнать что такое реф курсор.
AmKadа вроде бы как бы и нетcursor expressions предназначены прежде всего для PL/SQL Static SQL
https://docs.oracle.com/cloud/latest/db112/LNPLS/static.htm
За исключением экзотики типа xmltype.
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483279
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЗа исключением экзотики типа xmltype. XMLSEQUENCE rules!
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483288
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot dbms_photoshop]

В моем случае - это ничего не дает.
Дешевле текст запроса передать как параметр (очень длинная строка)
Так как в целом строку запроса приходиться формировать как для
REF CUR так и для передачи параметра.

Спасибо за уделенное время

Может есть еще идеи ?
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483302
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XМожет есть еще идеи ?
Не очень понимаю суть затруднений.
Если речь о static SQL, то ref cursor можно открывать (да, в теле - но все-таки статиком) так:

Код: plsql
1.
2.
3.
4.
declare
 rc sys_refcursor;
begin
 open rc for select rownum id, 'val'||rownum v from dual connect by level < 10; 



Кроме того, если структуры тоже статичны, то, возможно, вместо weak ref cursor лучше подойдет strong ref cursor.
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483323
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Не-не - дошел до истины ...

Все в норме
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
create or replace type ttAA as object
(
  C number,  

  constructor function ttAA(DBEG DATE
                           ) return self as result,

  constructor function ttAA(DBEG DATE,
                            DEND DATE
                           ) return self as result,
   member function Show return integer
)

create or replace type body ttAA as

constructor function ttAA(
                           DBEG DATE
                         ) return self as result
as begin
  DECLARE 
     TYPE curtype IS REF CURSOR;
     src_cur  curtype;
  BEGIN
    OPEN src_cur FOR select 10 F1 from DUAL;
    self.C:=DBMS_SQL.TO_CURSOR_NUMBER(src_cur);
    dbms_output.put_line('Hello1');
    return;
  end;  
end;  

constructor function ttAA(
                           DBEG DATE,
                           Dend DATE
                         ) return self as result
as begin
  DECLARE 
     TYPE curtype IS REF CURSOR;
     src_cur  curtype;
  BEGIN
    OPEN src_cur FOR select 30 F1 from DUAL  union all select 20 F1 from DUAL;
    self.C:=DBMS_SQL.TO_CURSOR_NUMBER(src_cur);
    dbms_output.put_line('Hello 2');
    return;
  end;  
end;  

member function Show return integer
as
  begin
    declare
      i    number;
      b    number;
    begin
      i:=0;
      b:=self.c;
      WHILE DBMS_SQL.FETCH_ROWS(b) > 0 LOOP
        i:= i+ 1;
        dbms_output.put_line('Show '||b);
      END LOOP;
      DBMS_SQL.CLOSE_CURSOR(b);
      return i;
    end;
  end;
end;



select ttAA(To_date('01-01-2017','DD-MM-YYYY'),To_date('01-01-2017','DD-MM-YYYY')).Show()
from DUAL

!!! dbms_photoshop - ЧЕЛОВЕЧИЩЕ большое спасибо за идею !!!!
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483326
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousНе очень понимаю суть затруднений.


Иногда надо вовремя ПОАААБЕДАТЬ
(и тема решается самопроизвольно)
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483335
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadОн вроде бы как бы и естьВ OCI только
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483381
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
[...]
constructor function ttAA(
                           DBEG DATE,
                           Dend DATE
                         ) return self as result
as begin
  DECLARE 
     TYPE curtype IS REF CURSOR; -- простите, милейший, а зачем вы так настойчиво делаете ЭТО? неужели политика Партии?
     src_cur  curtype;
  BEGIN
    OPEN src_cur FOR select 30 F1 from DUAL  union all select 20 F1 from DUAL; -- практически один хрен что OPEN FOR 'select foo from bar where col = :1' using var;
-- (всмысле, на мой взгляд, что в кавычках, что нет - особой роли не играет, кроме того что без кавычек валидируется на стадии компиляции. ошибаюсь?)
    self.C:=DBMS_SQL.TO_CURSOR_NUMBER(src_cur);
    dbms_output.put_line('Hello 2');
    return;
  end;  
end;  
[...]
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483471
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene-- OPEN src_cur FOR select 30 F1 from DUAL union all select 20 F1 from DUAL; -- >>>практически один хрен что OPEN FOR 'select foo from bar where col = :1' using var;<<<


У меня в продуктиве это выглядит на строк 70-100 с константами (которые в козявках 'hhhhh' и за которыми нужно следить)
А в этом случае я просто откопирую отлаженный в Dev-ре запрос, предварительно фиксируя параметры и типы
Т.е. проще в сборке и отладке а в целом "ХРЕН один"
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483473
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xв целом "ХРЕН один"
Статическая компиляция существенно удобнее динамической уже потому, что отлавливает многие ошибки на этапе компиляции, а не в рантайме.
...
Рейтинг: 0 / 0
Декларация курсора в user type
    #39483524
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicAmKadОн вроде бы как бы и естьВ OCI только
про только не понял
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> set pages 5000
SQL> var r refcursor
SQL> exec open :r for select * from dept;

PL/SQL procedure successfully completed.

SQL> select :r from dual;

:R
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON


SQL>



и тд ...

.....
stax
...
Рейтинг: 0 / 0
25 сообщений из 72, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Декларация курсора в user type
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]