Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
как можна хранимой процедурой в оракле получить набор записей, тоисть есть ли аналог foreach suspend interbasa в Pl/SQl
16 фев 07, 12:01    [3795390]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8130
sancoma
как можна хранимой процедурой в оракле получить набор записей, тоисть есть ли аналог foreach suspend interbasa в Pl/SQl
Опишите, пожалуйста, что делает "foreach suspend interbasa" и что вы там получаете в результате...
16 фев 07, 12:05    [3795436]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
alf123
Guest
1. Ref cursor
2. type of table (associative array, nested table)
16 фев 07, 12:06    [3795444]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
SQL*Plus
sancoma
как можна хранимой процедурой в оракле получить набор записей, тоисть есть ли аналог foreach suspend interbasa в Pl/SQl
Опишите, пожалуйста, что делает "foreach suspend interbasa" и что вы там получаете в результате...


Я о такой ситуации: если нада программно обработать набор записей который програма получает вызвав хранимую процедуру. Используя Interbase и в нем написав хранимую процедуру можна цыклом foreach в этой хранимой процедуре добиться того чтобы после вызова этой хранимой процедуры выдавался набор значений, так как бы мы просто написали обычный select в sql едиторе. А в PL/SQl я токого аналога не видел, тоисть процедура или может обработать набор записей внутри себя или выдать один набор значений, а вот чтобы всю выборку процедура вернула не встречал
16 фев 07, 12:18    [3795576]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
Elic
Member

Откуда:
Сообщений: 29976
sancoma
Я о такой ситуации: если нада программно обработать набор записей который програма получает вызвав хранимую процедуру. Используя Interbase и в нем написав хранимую процедуру можна цыклом foreach в этой хранимой процедуре добиться того чтобы после вызова этой хранимой процедуры выдавался набор значений, так как бы мы просто написали обычный select в sql едиторе. А в PL/SQl я токого аналога не видел, тоисть процедура или может обработать набор записей внутри себя или выдать один набор значений, а вот чтобы всю выборку процедура вернула не встречал
RTFM Returning Multiple Rows with Table Functions (FAQ)
16 фев 07, 12:28    [3795681]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
Спасибо за информацию, попробую разобраться. PL/SQl второй день токо знаю, так что сори за глупые вопросы
16 фев 07, 12:36    [3795764]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
А нету практических примеров по
RTFM кроме тех что у мануале, чтобы более конкретно. И еще такой вопросик: в процедуре можно создать временную таблицу чтобы она использовалась пока процедура работала, поотм в конце процедуры выдать весь набор с таблицы этой временной (как выдать спасибо Edic) а потом убить временную?
16 фев 07, 12:42    [3795831]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
Сори ник перепутал, Elic
16 фев 07, 12:43    [3795839]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
_spy_
Member

Откуда: Москва
Сообщений: 826
автор
А нету практических примеров по
RTFM кроме тех что у мануале, чтобы более конкретно.
См. Топ популярных вопросов. SQL, PL/SQL 4.Как вернуть запрос из функции

автор
И еще такой вопросик: в процедуре можно создать временную таблицу чтобы она использовалась пока процедура работала, поотм в конце процедуры выдать весь набор с таблицы этой временной (как выдать спасибо Edic) а потом убить временную?

Это порочная практика. Зачем это нужно?
16 фев 07, 12:51    [3795898]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
Это нужно по той причине что в теле процедуры бедет несколько однотипных select-ов, менятся будет токо таблица каждый раз, и потом все эти данные из этих селектов нада собрать в одну таблицу, и ее выдатьна выход процедуры (тоисть ее данные). Чтобы не запутывать попробую привести на примере как это было написано хранимой процедурой на интербейзе.
(Пример хранимой в интербейзе)
CREATE PROCEDURE .....

  CREATE temp TABLE t1
  (
  ......
  ......
  ......
  ......
  )

if val =1 then  insert into t1(...) select .... from tab1
if val =2 then  insert into t1(...) select .... from tab2
if val =3 then  insert into t1(...) select .... from tab3
foreach 
        select 
             .....
        into
             .....               
        from t1
        return........
end foreach;
drop table t1;
END PROCEDURE;
И в результате процедура выдает набор записей, которые получились как результат select-ов разных.
Что-то типа этого.
16 фев 07, 13:05    [3796020]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
спасиб _spy_ за линки
16 фев 07, 13:08    [3796049]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
_spy_
Member

Откуда: Москва
Сообщений: 826
автор
Это нужно по той причине что в теле процедуры бедет несколько однотипных select-ов, менятся будет токо таблица каждый раз, и потом все эти данные из этих селектов нада собрать в одну таблицу, и ее выдатьна выход процедуры (тоисть ее данные). Чтобы не запутывать попробую привести на примере как это было написано хранимой процедурой на интербейзе.

Ну если ваш пример отражают реальную суть, то получается, что запросы взаимоисключающие.

Тогда можно сделать так (если струкрура всех запросов одинакова):

CREATE function ..... return sys_refcursor
is
  my_cursor sys_refcursor;
begin

if val =1 then  open my_cursor for select .... from tab1
if val =2 then  open my_cursor for select .... from tab2
if val =3 then  open my_cursor for select .... from tab3

  return my_cursor
END ;
16 фев 07, 13:19    [3796149]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
Спасибо, а если б были запросы не взаимоисключающие, а скажем если нужно было бы в этот курсор запихнуть данные из двух запросов (структура одинакова) данные перекриваться не будут, тоисть нада чтобы результат был курсор который представлял суму двух запросов? Тоисть если бы в моем примере было б :

........
insert into t1(...) select .... from tab1
insert into t1(...) select .... from tab2
........

16 фев 07, 13:31    [3796255]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
_spy_
Member

Откуда: Москва
Сообщений: 826
автор
Спасибо, а если б были запросы не взаимоисключающие, а скажем если нужно было бы в этот курсор запихнуть данные из двух запросов (структура одинакова) данные перекриваться не будут, тоисть нада чтобы результат был курсор который представлял суму двух запросов? Тоисть если бы в моем примере было б :


open my_cursor for (select .... from tab1
                    union all
                    select .... from tab2);
16 фев 07, 13:38    [3796291]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
о класно, большое спасибо :)
16 фев 07, 14:24    [3796694]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
Мурз
Member

Откуда:
Сообщений: 204
sancoma
о класно, большое спасибо :)

ты с этим не заморачивайся лучше
oracle устроен по другому , не предназначен он для таких штук хоть и есть возможность это сделать , через коллекции hihlined и т.д
лучше пересмотреть архитектуру приложения и для построения сложных отчетов (правильное предположение?)
использовать одну единственную временную таблицу
примерно такой структуры
table - report
columns
id - как принято
v1 varchar2(2000)
v2 varchar2(2000)
...
v22 varchar2(2000)
..
n1 number (разрядность как у вас принято)
n2 number
...
n22 number
...
t1 datetime
t2 datetime
..
t22 datetime
16 фев 07, 18:42    [3798847]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
Dimka08
Member

Откуда:
Сообщений: 319
Мурз
sancoma
о класно, большое спасибо :)

ты с этим не заморачивайся лучше
oracle устроен по другому , не предназначен он для таких штук хоть и есть возможность это сделать , через коллекции hihlined и т.д
лучше пересмотреть архитектуру приложения и для построения сложных отчетов (правильное предположение?)
использовать одну единственную временную таблицу
примерно такой структуры
table - report
columns
id - как принято
v1 varchar2(2000)
v2 varchar2(2000)
...
v22 varchar2(2000)
..
n1 number (разрядность как у вас принято)
n2 number
...
n22 number
...
t1 datetime
t2 datetime
..
t22 datetime


а если нало посмотреть несколько отчетов одновременно?
и вообще странная идея действительно нормально работает?
19 фев 07, 13:27    [3804736]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
_spy_
Member

Откуда: Москва
Сообщений: 826
Мурз
ты с этим не заморачивайся лучше
oracle устроен по другому , не предназначен он для таких штук хоть и есть возможность это сделать , через коллекции hihlined и т.д

Для чего он не предназначен? Чтобы курсоры возращать? Речь об этом шла.

Мурз
лучше пересмотреть архитектуру приложения и для построения сложных отчетов (правильное предположение?)
использовать одну единственную временную таблицу
примерно такой структуры
table - report
columns
id - как принято
v1 varchar2(2000)
v2 varchar2(2000)
...
v22 varchar2(2000)
..
n1 number (разрядность как у вас принято)
n2 number
...
n22 number
...
t1 datetime
t2 datetime
..
t22 datetime

А это громадье вообще зачем??
19 фев 07, 13:39    [3804819]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
Есть такой вопрос, может кто подскажет:
если есть курсор который получился как
open my_cursor for (select .... from tab1
                    union all
                    select .... from tab2);
теперь нада (если это возможно) по этому курсору сделать выборку с групировкой и сортировкой.
Можно ли это сделать?
Тоисть нада просто выбрать все из этого курсора, сгрупировать некоторые поля и отсортировать данные по некоторым полям.
20 фев 07, 18:29    [3812438]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
Goldminer
Member

Откуда:
Сообщений: 553
Похоже, Вам таки временная таблица нужна. Здесь.
20 фев 07, 18:42    [3812512]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
жжет
Guest
sancoma
PL/SQl второй день токо знаю
20 фев 07, 18:50    [3812550]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
%%%%
Guest
Goldminer
Похоже, Вам таки временная таблица нужна. Здесь.


на каком основании подобное предположение ?
судя по этому
sancoma
Тоисть нада просто выбрать все из этого курсора, сгрупировать некоторые поля и отсортировать данные по некоторым полям.

имеет смысл использовать запрос из функции.

хотя с темповой табличкой действительно меньше будет переписывания кода. :))
20 фев 07, 18:55    [3812572]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
У меня вопрос по работе с датами:
темповую таблицу заполняю таким образом:
insert into temptable1(prm1,prm2...) 
select 
    field1,field2....
from ....
where (поле типа date)='01.02.2006'
Если это написать просто в SQl редакторе то временная таблица заполняется коректно, ошибок не возникает, а если использовать тот же самй SQl текст токо делать это:

Execute immediate 'insert into temptable1.... where (поле типа date)=''01.02.2006'''
то при попытке заполнить таблицу возникает ошибка 'not a valid month', хотя данные того поля типа date для которой делаю селект занесены в формате 'DD.MM.YYYY'
21 фев 07, 12:35    [3815151]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
Elic
Member

Откуда:
Сообщений: 29976
sancoma
where (поле типа date)='01.02.2006'
RTFM TO_DATE (FAQ)
21 фев 07, 12:46    [3815238]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку  [new]
sancoma
Member

Откуда:
Сообщений: 149
я пробувал TO_DATE, тут просто в том фишка что даже если написать

Execute immediate 'insert into temptable1.... where (поле типа date)='
||TO_CHAR(TO_DATE('01.06.2006','DD.MM.YYYY'),'DD.MM.YYYY')

вверавно ошибка
21 фев 07, 13:06    [3815422]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить