|
|
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
AnatalexПередавай не сам реф курсор, а номер курсора определенный с помощью того же dbms_sql и будет тебе счастьеБездумный гон пурги продолжается Ты вопрос всё-таки прочитал бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 13:49 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
Elic AnatalexПередавай не сам реф курсор, а номер курсора определенный с помощью того же dbms_sql и будет тебе счастьеБездумный гон пурги продолжается Ты вопрос всё-таки прочитал бы. Я то прочитал. А ты подумай для чего это. Или мозгов не хватает? Просто не известна структура запроса. Ну и что. Обработай его с помощью dbms_sql. Или весь мир на ref cursor как таковой сошелся? Только он и трава не расти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 14:46 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
With PL/SQL8, you can now obtain information about the structure of the columns of your dynamic cursor. The DBMS_SQL.DESCRIBE_COLUMNS procedure obtains information about your dynamic cursor. Here is the header: PROCEDURE DBMS_SQL.DESCRIBE_COLUMNS (c IN INTEGER ,col_cnt OUT INTEGER ,desc_t OUT DBMS_SQL.DESC_TAB); Parameters c The pointer to the cursor. col_cnt The number of columns in the cursor, which equals the number of rows defined in the PL/SQL table. desc_t The PL/SQL table, which contains all of the column information. This is a table of records of type DBMS_SQL.DESC_REC (<table_type>), described below. <table_type> Datatype Description col_type BINARY_INTEGER Type of column described col_max_len BINARY_INTEGER Maximum length of column value col_name VARCHAR2(32) Name of the column col_name_len BINARY_INTEGER Length of the column name col_schema_name VARCHAR2(32) Name of column type schema if an object type col_schema_name_len BINARY_INTEGER Length of schema name col_precision BINARY_INTEGER Precision of column if a number col_scale BINARY_INTEGER Scale of column if a number col_charsetid BINARY_INTEGER ID of character set col_charsetform BINARY_INTEGER Character set form col_null_ok BOOLEAN TRUE if column can be NULL The values for column types are as follows: Datatype Number VARCHAR2 1 NVARCHAR2 1 NUMBER 2 INTEGER 2 LONG 8 ROWID 11 DATE 12 RAW 23 LONG RAW 24 CHAR 96 NCHAR 96 MLSLABEL 106 CLOB (Oracle8) 112 NCLOB (Oracle8) 112 BLOB (Oracle8) 113 BFILE (Oracle8) 114 Object type (Oracle8) 121 Nested table Type (Oracle8) 122 Variable array (Oracle8) 123 When you call this program, you need to have declared a PL/SQL table based on the DBMS_SQL.DESC_T. You can then use PL/SQL table methods to traverse the table and extract the needed information about the cursor. The following anonymous block shows the basic steps you will perform when working with this built-in: DECLARE cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR; cols DBMS_SQL.DESC_T; ncols PLS_INTEGER; BEGIN DBMS_SQL.PARSE (cur, 'SELECT hiredate, sal FROM emp', DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN (cur, 1, SYSDATE); DBMS_SQL.DEFINE_COLUMN (cur, 2, 1); DBMS_SQL.DESCRIBE_COLUMNS (cur, ncols, cols); FOR colind IN 1 .. ncols LOOP DBMS_OUTPUT.PUT_LINE (cols.col_name); END LOOP; DBMS_SQL.CLOSE_CURSOR (cur); END; / ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 14:54 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
AnatalexИли весь мир на ref cursor как таковой сошелся?В постановке задачи - сошёлся. А решать незаданные задачи - это есть использование "мозгов, которых хватает"() для "пурги". Чтобы отказаться от ref cursor в приёмнике, нужно также от него отказаться и в передатчике. Т.е. полный redesign. Сомневаюсь, что оно ему надо. P.S. И не надо дампить килы доки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 15:01 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
AnatalexЯ то прочитал. А ты подумай для чего это. Или мозгов не хватает? Просто не известна структура запроса. Ну и что. Обработай его с помощью dbms_sql. Или весь мир на ref cursor как таковой сошелся? Только он и трава не расти. 1. Уважаемый, ну зачем же так грубо? 2. Решения проблемы у Вас нет, поскольку предложения отказаться от ref cursor Вы не вносили. Зато вносили предложение определить структуру ref cursor посредством dbms_sql... :) 3. "Весь мир", может, и не сошелся, но далеко не всегда можно обойтись передачей текста запроса. Например, если данные нужны в методе, который работает от имени другого пользователя... Или метод - поставщик данных используется в иных приложениях и не может быть изменен по соображениям совместимости или по условиям лицензионного соглашения. 4. Я не буду говорить про чуждые Вам концепции инкапсуляции, соображения сопровождаемости или хотя бы банальную безопасность (поищите по форуму sql injection). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 15:06 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous AnatalexЯ то прочитал. А ты подумай для чего это. Или мозгов не хватает? Просто не известна структура запроса. Ну и что. Обработай его с помощью dbms_sql. Или весь мир на ref cursor как таковой сошелся? Только он и трава не расти. 1. Уважаемый, ну зачем же так грубо? 2. Решения проблемы у Вас нет, поскольку предложения отказаться от ref cursor Вы не вносили. Зато вносили предложение определить структуру ref cursor посредством dbms_sql... :) 3. "Весь мир", может, и не сошелся, но далеко не всегда можно обойтись передачей текста запроса. Например, если данные нужны в методе, который работает от имени другого пользователя... Или метод - поставщик данных используется в иных приложениях и не может быть изменен по соображениям совместимости или по условиям лицензионного соглашения. 4. Я не буду говорить про чуждые Вам концепции инкапсуляции, соображения сопровождаемости или хотя бы банальную безопасность (поищите по форуму sql injection). А кто сказал, что нужно передавать текст запроса? Разве я такое говорил? Передавать нужно лишь указатель на курсор - его номер. Это вы не очень то въехали. Инкапсуляция здесь не при чем. Это первое. А второе - гон пурги это когда говорят зделать ничего нельзя можешь только кол-во строк узнать. Я же предложил решение проблемы. А человек сам разберется, что ему нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 15:11 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
AnatalexА кто сказал, что нужно передавать текст запроса? Разве я такое говорил?Вообще-то именно так был воспринят Ваш пост с текстом процедуры. Рад, что Вы изменили мнение. Anatalex А второе - гон пурги это когда говорят зделать ничего нельзя можешь только кол-во строк узнать. Я же предложил решение проблемы.РЕШЕНИЕ предложил DenisPopov. Ваши же посты - решение какой-то совсем другой задачи Anatalex А человек сам разберется, что ему нужно А вот это уж обязательно. Лишь бы те, кто будет давать советы "после нас", не апеллировали потом к Вашим предложениям определять структуру ref cursor посредством dbms_sql ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 15:32 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous AnatalexА кто сказал, что нужно передавать текст запроса? Разве я такое говорил?Вообще-то именно так был воспринят Ваш пост с текстом процедуры. Рад, что Вы изменили мнение. Anatalex А второе - гон пурги это когда говорят зделать ничего нельзя можешь только кол-во строк узнать. Я же предложил решение проблемы.РЕШЕНИЕ предложил DenisPopov. Ваши же посты - решение какой-то совсем другой задачи Anatalex А человек сам разберется, что ему нужно А вот это уж обязательно. Лишь бы те, кто будет давать советы "после нас", не апеллировали потом к Вашим предложениям определять структуру ref cursor посредством dbms_sql Если вы не поняли, так и не говорите. Я предлагал определить структуру курсора, неизвестной структуры с помощью dbms_sql для этого этот пакет и предназначен. Если вы хотите приплетать для этого яву, флаг вам в руки, но все эти вещи прекрасно решаются с помощью dbms_sql . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 15:43 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
ВопросикВопрос знающим людям: Как прокрутить реф-курсор в цикле, если неизвестна его структура ? Если тебе только прокрутить то может быть сгодится делать всегда 1е поле типа нумбер и выводить его в 1? тогда просто отфетсишь сколько надо то есть все крсоры делать 'select 1 fiktivnoje_pole, ....' а потом вроде можно делать фетч только в 1е поле fetch ref_cur into tmp и пофингу что там есть что-то дальше al Antalex: Ты не понял. Пакет dbms_sql не умеет работать с реф_курсорами и преобразование из одного типа в другой невозможно. Я на еот форум пришел как раз с таким вопросом Мне так ответили со ссылкой на какой-то буржуинский сайт. Если знаешь как - напиши ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 15:59 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
Sxak ВопросикВопрос знающим людям: Как прокрутить реф-курсор в цикле, если неизвестна его структура ? Если тебе только прокрутить то может быть сгодится делать всегда 1е поле типа нумбер и выводить его в 1? тогда просто отфетсишь сколько надо то есть все крсоры делать 'select 1 fiktivnoje_pole, ....' а потом вроде можно делать фетч только в 1е поле fetch ref_cur into tmp и пофингу что там есть что-то дальше al Antalex: Ты не понял. Пакет dbms_sql не умеет работать с реф_курсорами и преобразование из одного типа в другой невозможно. Я на еот форум пришел как раз с таким вопросом Мне так ответили со ссылкой на какой-то буржуинский сайт. Если знаешь как - напиши С реф курсорами он действительно не работает. Но можно определить ссылку на курсор любой структуры. Т.е. переменная будет не ref cursor. А будет ссылка (типа INTEGER) на курсор . С помощью этой ссылки в пакете dbms_sql можно из курсора получить все что угодно. Названия, типы, кол-во, значения полей и т.д. И эту ссылку можешь передавать куда угодно в пределах pl/sql из процедуры в процедуру пока курсор не закрыт. К какому полю какую переменную привязывать опять же можно динамически, типы то полей и их порядок определяются без проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 16:13 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
AnatalexНо можно определить ссылку на курсор любой структуры. Т.е. переменная будет не ref cursor. А будет ссылка (типа INTEGER) на курсор . С помощью этой ссылки в пакете dbms_sql можно из курсора получить все что угодно. Хочется присоединиться к желающим посмотреть реализацию этой идеи. Вообще то dbms.define_column и dbms.desribe_columns работают после разбора выполненного dbms.parse. А для этого надо знать текст запроса, который будете разбирать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 17:00 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
ten AnatalexНо можно определить ссылку на курсор любой структуры. Т.е. переменная будет не ref cursor. А будет ссылка (типа INTEGER) на курсор . С помощью этой ссылки в пакете dbms_sql можно из курсора получить все что угодно. Хочется присоединиться к желающим посмотреть реализацию этой идеи. Вообще то dbms.define_column и dbms.desribe_columns работают после разбора выполненного dbms.parse. А для этого надо знать текст запроса, который будете разбирать. Так ведь, когда создается и открывается реф курсор его текст тоже известен. Почему вместо открытия реф курсора не распарсить его с помощью dbms_sql? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 17:11 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
Вопросик Как прокрутить реф-курсор в цикле, если неизвестна его структура ? ты решаешь не ту задачу (см. со слов "чтобы отказаться от ref cursor...") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 17:19 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
сорри, не понял чем закончилось обсуждение темы. столкнулся с проблемой аналогично автора темы, но немного проще: процедуры возвращают открытые реф-курсоры. можно ли узнать а) нет ли там ошибки (ошибка будет на фетче, т.к. при открытии курсора запрос не выполняется) б) число записей. а фетч я сделать не могу, т.к. не знаю структуры по описанию мне бы очень подошла функция DBMS_HS_PASSTHROUGH.FETCH_ROW нет ли чего подобного для анализа Oracle-курсора ? brant2000 получить данные из курсора неизвестной структуры в PL/SQL нельзя, только количество записей. и как ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 12:23 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
а можно ли без динамики открыть курсорную переменную из курсорА ? что-то типа open v_ref_dat for c_all_list; , где c_all_list - описанный выше курсор зачем надо? результирующий набор селекта одинаковый, а немного различаются фильтры. Не хочется прям внутри блока прописывать, хотела в секции объявлений описать все вариантры курсоров, чтобы не прыгать потом по всей проге и искать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 18:41 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
ОкеанНадеждыа можно ли без динамики открыть курсорную переменную из курсорА ?И с динамикой нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 18:55 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
ElicОкеанНадеждыа можно ли без динамики открыть курсорную переменную из курсорА ?И с динамикой нельзя. ???? https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sql.htm#CHDJDGDG ни разу не использовал, нужды не было. Но вроде по описанию то, что надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 18:58 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
ОкеанНадежды хотела в секции объявлений описать все вариантры курсоров, чтобы не прыгать потом по всей проге и искать Покажите пожалуйста способ, которым Вы предполагаете выбирать конкретный вариант курсора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 19:06 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 19:15 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
ой, только там не rc,а t разумеется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 19:16 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
точнее не t, а t_cur :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 19:27 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
ОкеанНадежды[src pl/sql] if n = 1 then open t for c; else open t for b; end if; [/src] В таком варианте все, что Вам надо, это объявить курсоры varchar2-переменными. :) Проверку структуры возвращаемого результата можно оформить посредством объявления strong ref cursor. Рассмотрите еще такой вариант: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 19:31 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
И да, есть еще один очевидный способ - варианты запроса можно оформить статикой посредством перегрузки функций, возвращающих курсор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 19:34 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
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. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 20:11 |
|
||
|
Как прокрутить реф-курсор в цикле ?
|
|||
|---|---|---|---|
|
#18+
Андрей, спасибо! про varchar2 - писала выше, что не хотелось бы динамики. Второй вариант интересный :) хотя у меня вообще-то пока всего 2 курсора на выбор, можно проще их просто в открытии переменной да и прописать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 21:05 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39638171&tid=1884060]: |
0ms |
get settings: |
8ms |
get forum list: |
23ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 223ms |
| total: | 436ms |

| 0 / 0 |
