Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Декларация курсора в user type / 25 сообщений из 72, страница 1 из 3
05.07.2017, 10:40
    #39482991
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
Доброго дня господа !

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

А именно
Код: 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
05.07.2017, 10:50
    #39483002
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
HOME_XВозможно ли представить курсор как поле объектаВ SQL нет типа данных "курсор".
...
Рейтинг: 0 / 0
05.07.2017, 11:33
    #39483044
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
Elic,

Принято !

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

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

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

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

Спасибо
...
Рейтинг: 0 / 0
05.07.2017, 12:11
    #39483086
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
HOME_XВаши предложения ?Не надо за уши притягивать измышлизмы.
...
Рейтинг: 0 / 0
05.07.2017, 13:08
    #39483121
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
HOME_XВаши предложения ?
Если версия 11g, то можешь попробовать создать поле типа cursor_id и потом работать с ним через dbms_sql.to_refcursor.
Если версия 12c, то можешь посмотреть в сторону dbms_sql.return_result и реализовать метод, который возвращает implicit result set.
...
Рейтинг: 0 / 0
05.07.2017, 15:29
    #39483238
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
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
05.07.2017, 15:44
    #39483250
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
Поскольку Вы хотите "курсор как поле объекта" (т.е. типа member variable), а не "Тип <КУРСОР> как поле объекта", то напрашивается ето:
HOME_X
Код: plsql
1.
2.
3.
4.
5.
6.
create or replace type ttAA as object
(
  gencurtyp sys_refcursor,   - !!!!  ЗДЕСЬ !!!!

[...]
)

так?
...
Рейтинг: 0 / 0
05.07.2017, 15:46
    #39483253
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
HOME_XВозможно ли представить курсор как поле объектаДля чего?
...
Рейтинг: 0 / 0
05.07.2017, 15:50
    #39483255
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
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
05.07.2017, 15:51
    #39483257
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
AmKadДля чего?если ТС и в пакетах использует совершенно ненужную конструкцию TYPE gencurtyp IS REF CURSOR, то что-то мне подсказывает, что он не вкурсе, что такое SYS_REFCURSOR..
...
Рейтинг: 0 / 0
05.07.2017, 16:01
    #39483265
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
А в 12 ето можно делать?

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

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

.....
stax
...
Рейтинг: 0 / 0
05.07.2017, 16:05
    #39483270
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
--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
05.07.2017, 16:08
    #39483272
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
AmKad,

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

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

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

Может есть еще идеи ?
...
Рейтинг: 0 / 0
05.07.2017, 16:55
    #39483302
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
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
05.07.2017, 17:26
    #39483323
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
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
05.07.2017, 17:30
    #39483326
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
andrey_anonymousНе очень понимаю суть затруднений.


Иногда надо вовремя ПОАААБЕДАТЬ
(и тема решается самопроизвольно)
...
Рейтинг: 0 / 0
05.07.2017, 17:51
    #39483335
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
AmKadОн вроде бы как бы и естьВ OCI только
...
Рейтинг: 0 / 0
05.07.2017, 19:11
    #39483381
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
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
06.07.2017, 00:58
    #39483471
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
--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
06.07.2017, 01:19
    #39483473
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
HOME_Xв целом "ХРЕН один"
Статическая компиляция существенно удобнее динамической уже потому, что отлавливает многие ошибки на этапе компиляции, а не в рантайме.
...
Рейтинг: 0 / 0
06.07.2017, 08:40
    #39483524
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декларация курсора в user type
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Декларация курсора в user type / 25 сообщений из 72, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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