Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Select Into  [new]
Jey1977
Member

Откуда:
Сообщений: 7
Добрый день всем. Вопрос наверняка ламерский, но ответа никак не могу найти....

Есть пакет. В заголовке пакета объявлено:
type rid_line_rcmd is record (row_id rowid);
type rid_list_rcmd is table of rid_line_rcmdd;

В теле пакета:
lt_rowid rid_list_rcmd;

Ну и запрос:
select t.rowid into
lt_rowid
from my_table t
where t.switch is null;

Ругается на lt_rowid. Говорит не правильный тип. Как победить?
28 июн 12, 12:49    [12788099]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Jey1977,
читать документацию про bulk collect
28 июн 12, 12:51    [12788111]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Зачем тебе record, состоящая из 1 поля?
28 июн 12, 12:51    [12788120]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Изя Кацман
Member

Откуда: Великий Эксперимент
Сообщений: 2019
Jey1977
Добрый день всем. Вопрос наверняка ламерский, но ответа никак не могу найти....

Есть пакет. В заголовке пакета объявлено:
  type rid_line_rcmd is record (row_id rowid);
  type rid_list_rcmd is table of rid_line_rcmdd;

В теле пакета:
 lt_rowid rid_list_rcmd; 


Ну и запрос:
      select t.rowid  into
       lt_rowid
        from my_table t 
        where t.switch is null;


Ругается на lt_rowid. Говорит не правильный тип. Как победить?
28 июн 12, 12:55    [12788144]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
rsltr
Member

Откуда: Москва
Сообщений: 464
Jey1977
Как победить?


DECLARE
  type rid_line_rcmd is record (row_id rowid);
   type rid_list_rcmd IS TABLE OF rid_line_rcmd;
   lt_rowid rid_list_rcmd;   
   CURSOR cur IS select t.rowid from my_table t where t.switch is null;
BEGIN
  OPEN cur;
  FETCH cur BULK COLLECT INTO lt_rowid;
  CLOSE cur;
END;
28 июн 12, 13:17    [12788286]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Селектоид
Guest
Два варианта, в зависимости от:
либо
lt_rowid rid_line_rcmd; 

либо
select t.rowid bulk collect into
       lt_rowid
        from my_table t 
        where t.switch is null;
28 июн 12, 13:20    [12788309]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
rsltr
Member

Откуда: Москва
Сообщений: 464
Селектоид
Два варианта, в зависимости от:
либо
lt_rowid rid_line_rcmd; 



а что это за вариант?
28 июн 12, 13:22    [12788335]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Jey1977
Member

Откуда:
Сообщений: 7
Спасибо всем...

А каким образом теперь правильно использовать получившуюся штуковину в условии WHERE ?

select
t1.a1 as a1,
.......
t2.b2 as b2

from my_table1 t1,
my_table2 t2
where t1.rowid
in lt_rowid <<------------------------------- вот тут опять ругается...
and t1.a1 = t2.b2
28 июн 12, 13:44    [12788505]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Изя Кацман
Member

Откуда: Великий Эксперимент
Сообщений: 2019
Jey1977
Спасибо всем...

А каким образом теперь правильно использовать получившуюся штуковину в условии WHERE ?

 select 
             t1.a1 as a1,
              ....... 
             t2.b2 as b2
            
          from my_table1 t1,
            my_table2 t2
           where t1.rowid  
                 in  lt_rowid             <<------------------------------- вот тут опять ругается...
           and t1.a1 = t2.b2
28 июн 12, 13:46    [12788520]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Jey1977
Member

Откуда:
Сообщений: 7
Никто ничего не посоветует?
28 июн 12, 15:43    [12789447]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Jey1977,
иди уже почитай документацию, там есть ссылки.... тебе прямые ответы вредны.
28 июн 12, 15:48    [12789492]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
rsltr
Member

Откуда: Москва
Сообщений: 464
Jey1977
Никто ничего не посоветует?


а что ты хочешь сделать в итоге?что ты делаешь это можно сделать без PL/SQL
28 июн 12, 15:49    [12789501]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Jey1977
Member

Откуда:
Сообщений: 7
Vint, да уж спасибо за совет достопочтимый ГУРУ. Ее то и читаю, и не надо подспустно обвинять в лентяйстве, ок? Иногда быват так, что нужно быстро найти готовое решение, и когда нет времени неделю разбираться в синтакисие языка. Поэтому и спрашиваю на форуме.

автор
а что ты хочешь сделать в итоге?что ты делаешь это можно сделать без PL/SQL


К сожалению нельзя.

Общая суть задачи такая:
Есть 2 таблицы. 1) Строки документа со ссылкой на уникальный заголовок по ИД. 2) Заголовки документов с уникальным ИД каждый + в этой таблице поле с крестиком (забирали данные или нет).
Надо при помощи одного запроса (причем обязательно SELECT....., только не надо спрашивать зачем это надо) выбрать все документы которые не выбирались до этого и поставить в таблице с заголовками крестик на тех документах которые забрал.
Само по себе - напрашивается piplined функция...


Что сделал:

create or replace
package pck1 is 

type res_line_rcmd
IS
  record
  (
    doc           varchar2(64 char),
    run           varchar2(14 char),
      ...
    qty           varchar2(10 char),
    uom           VARCHAR2(8 CHAR)
    );
 
 type res_list_rcmd is
  table of res_line_rcmd;
 
 -------------------------------------------------------------
 
 type rid_line_rcmd is record (row_id rowid);
 type rid_list_rcmd is table of rid_line_rcmd;
 
 -------------------------------------------------------------
 function resultset_rcmd
  return res_list_rcmd pipelined;


function save_data_rcmd_array (tab_rowid rid_list_rcmd,l_sw varchar2) return boolean;  
end pck1;



create or replace
package body pck1 as

  function resultset_rcmd
  return res_list_rcmd pipelined is
    l_rid rowid;
    l_res res_line_rcmd;
    l_myrow rowid;
    my_bool BOOLEAN;
    my_process_sw varchar2(14);
    lt_rowid rid_list_rcmd; 
    
   
    
    
  begin
   select to_char(sysdate,'YYYYMMDDHH24MISS') into my_process_sw from dual;
    
        select t.rowid bulk collect    
        into lt_rowid
         from rcmnd_control_int_staging t 
        where t.switch is null;
        
        my_bool := save_data_rcmd_array(lt_rowid, my_process_sw);
       

        
        IF my_bool=true THEN
          FOR c IN
          (
            select 
             t1.if_type as if_type,
                 ..............                                            <<------------- тут много пропущено
             t2.UOM as uom
            
          from rcmnd_control_int_staging t1,
            rcmnd_item_int_staging t2
           where (
                  t1.rowid  in lt_rowid                      <<------------------------ тут ругается
                  and t1.run_id  = t2.run_id
                 )
           )
          
          
          loop
            l_res.doc          := ...
              ..............                                            <<------------- тут много пропущено       
             l_res.uom          :=c.uom;
            pipe row (l_res);
          end loop;
          
        end if;

    exception
     when no_data_found then
     null; 
  end resultset_rcmd;

 

  function save_data_rcmd_array (tab_rowid rid_list_rcmd,l_sw varchar2) return boolean 
   IS
   PRAGMA AUTONOMOUS_TRANSACTION;
  begin
         update rcmnd_control_int_staging t set t.switch=l_sw
          WHERE (t.rowid in tab_rowid);                        <<------------------------ тут ругается
       COMMIT;
       RETURN true;
        EXCEPTION
        WHEN OTHERS THEN
       rollback;
       return false;
  end save_data_rcmd_array;
  


end pck1;




если сказать что lt_rowid это одно значение типа rowid И ограничить выборку в начале тела пакета по rownum=1 то все прекрасно работает и запрос

select * from table (pck1.resultset_rcmd)


выдает и апдейтит все что надо. Но по ОДНОМУ документу. А мне надо сразу все.....
28 июн 12, 16:14    [12789674]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Jey1977,
от оно мне надо тебя подспудно обвинять... я тебя напрямую могу тупым назвать) и все твои изголения абсолютно не нужны)
"Иногда быват так, что нужно быстро найти готовое решение, и когда нет времени неделю разбираться в синтакисие языка." - а так бывает только у быдлокодеров) коим ты и являешся. хотя до просто решения через collection type ровно 1 шаг.
28 июн 12, 16:39    [12789833]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Jey1977
Member

Откуда:
Сообщений: 7
Vint,
 а так бывает только у быдлокодеров


Быдлокодеры, ламеры, базарные бабы и М.С. Горбачев вместо ответа на четко и ясно поставленный вопрос развивают витиеватые рассуждения о смысле жизни ( в данном случае = вредности быдлокода). Если вы хотите дать ответ на вопрос - давайте, если не хотите не надо оффтопить в теме. Я прекрасно понимаю что для меня вредно и что полезно, но на данный момент мне нужно БЫСТРО найти решение проблемы. Не думаю что в дальнейшем я еще раз столкнусь с подобной проблемой, и к сожалению у меня нет опыта программирования на PL\SQL и использования Oracle вообще. С чем успел разобраться за сутки - с тем успел. Дальше времени разбираться нет. Нужно решение. Вот и весь вопрос. Рассуждения о быдлокодерстве можно продолжить на говнокод-ру если вам это интересно.
28 июн 12, 16:51    [12789925]     Ответить | Цитировать Сообщить модератору
 Re: Select Into  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Jey1977,
не тебе указывать что и где мне обсуждать) как задал вопрос так тебе и отвечают.
28 июн 12, 16:54    [12789946]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить