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

Откуда:
Сообщений: 231
Есть процедура, в которой красным отмечена проблемная строка, синим рабочий вариант.

procedure company_land is

-- name_c varchar2(100);
name_c name%TYPE;


cursor c_company_land is
select name from company_land;

begin
open c_company_land;

LOOP
fetch c_company_land into name_c;

if c_company_land%notfound
then
close c_company_land;
exit;
else
dbms_output.put_line(name_c);
end if;
end loop;

end company_land;

Не пойму, можно ли в процедуре присваивать переменной, тип столбца с таблицы, или в процедурах такое не применимо. Подскажите где возможно использовать %TYPE и %ROWTYPE.
6 ноя 13, 17:10    [15086169]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
monstr76,
[schema].table_name.column_name%TYPE
6 ноя 13, 17:12    [15086186]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
123йй
Member

Откуда:
Сообщений: 1637
monstr76,

Дока
name_c company_land.name%TYPE;
6 ноя 13, 17:13    [15086199]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
name_c company_land.name%TYPE;
Compilation errors for PACKAGE BODY JUR.PORT

Error: PLS-00302: компонента 'NAME' должна быть объявлена
Line: 24
Text: name_c company_land.name%TYPE;

Error: PL/SQL: Item ignored
Line: 24
Text: name_c company_land.name%TYPE;
6 ноя 13, 17:15    [15086218]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
я забыл сказать что процедура в пакете, может там есть отличия?
6 ноя 13, 17:24    [15086275]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
PooH_2
Member

Откуда:
Сообщений: 266
Нет там отличий. Кстати, такая процедура не могла бы существовать отдельно, так как название конфликтует с названием таблицы.

давай describe таблицы и полный код процедуры (используй тег [ SRC ])
6 ноя 13, 17:39    [15086365]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
PooH_2
Member

Откуда:
Сообщений: 266
кстати, о птичках! переименуй процедуру! у тебя не в таблице поле ищется, а локальная переменная в процедуре.
6 ноя 13, 17:42    [15086394]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
PooH_2
Member

Откуда:
Сообщений: 266
... или перед названием таблицы укажи схему
6 ноя 13, 17:44    [15086410]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
AndT
Member

Откуда: Москва-Германия
Сообщений: 277
monstr76
name_c company_land.name%TYPE;
Compilation errors for PACKAGE BODY JUR.PORT

Error: PLS-00302: компонента 'NAME' должна быть объявлена
Line: 24
Text: name_c company_land.name%TYPE;

Error: PL/SQL: Item ignored
Line: 24
Text: name_c company_land.name%TYPE;


Стесняюсь спросить, а права на чтение из таблицы у юзера JUR есть? И схему действиельно надо указывать (ну или синоним создавать).
6 ноя 13, 17:47    [15086441]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
переименовал процедуру, другая ошибка:
Compilation errors for PACKAGE BODY JUR.PORT

Error: PLS-00225: ссылка на подпрограмму или курсор 'COMPANY_LAND' вне области действия
Line: 24
Text: name_c company_land.name%TYPE;

Error: PL/SQL: Item ignored
Line: 24
Text: name_c company_land.name%TYPE;


SQL> describe company_land;
Name    Type          Nullable Default Comments 
------- ------------- -------- ------- -------- 
ID      NUMBER        Y                         
NAME    VARCHAR2(100) Y                         
COUNTRY VARCHAR2(50)  Y                         
CITY    VARCHAR2(50)  Y   


procedure p_company_land is

--  name_c varchar2(100); 
    name_c company_land.name%TYPE; 
   
     
  cursor c_company_land is
    select name from company_land;
      
  begin
    open c_company_land;
    
    LOOP 
    fetch c_company_land into name_c;
    
        if c_company_land%notfound 
            then 
              close c_company_land;
              exit;
            else
              dbms_output.put_line(name_c);
        end if;
    end loop;    
    
end p_company_land;  
6 ноя 13, 17:48    [15086447]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
monstr76,

вкратце:
declare
  cursor my_cursor is select dummy as dummy2 from dual;

  l_cursor my_cursor%rowtype;
  l_dummy1  l_cursor.dummy2%type;
begin
   open my_cursor;
   fetch my_cursor into l_cursor;
   close my_cursor;
   l_dummy1:=l_cursor.dummy2;
   declare
       l_dummy2  l_dummy1%type;
   begin
       l_dummy2:=l_cursor.dummy2;
   end;
end;
6 ноя 13, 17:50    [15086454]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
PooH_2
Member

Откуда:
Сообщений: 266
таблица и пакет в одной схеме?
6 ноя 13, 17:50    [15086456]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
то есть, так:
declare
  cursor my_cursor is select dummy as dummy2 from dual;

  l_cursor my_cursor%rowtype;
  l_dummy1 l_cursor.dummy2%type;
  l_dummy2 l_dummy1%type;
begin
   open my_cursor;
   fetch my_cursor into l_cursor;
   close my_cursor;
   l_dummy1:=l_cursor.dummy2;
   l_dummy2:=l_cursor.dummy2;
end;
6 ноя 13, 17:51    [15086466]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
PooH_2
таблица и пакет в одной схеме?

объясни, в одном табличном пространстве точно.
6 ноя 13, 17:52    [15086477]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
PooH_2
Member

Откуда:
Сообщений: 266
monstr76,

хм... ну скажем так, они одному пользователю принаждлежат?

надеюсь пакет не называется company_land?
попробуй переменную поставить ниже курсора - будет на курсор ругаться?
6 ноя 13, 17:54    [15086498]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
посмотрел, все в одной схеме.
6 ноя 13, 17:55    [15086506]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
PooH_2,

Пакет называется PORT

поменял ниже курсора, та же ошибка.
6 ноя 13, 17:57    [15086516]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
monstr76
PooH_2,

Пакет называется PORT

поменял ниже курсора, та же ошибка.

PACKAGE BODY JUR.PORT
6 ноя 13, 17:58    [15086521]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
K790
Member

Откуда:
Сообщений: 633
monstr76,

мне кажется у вас проблемы с именованием.
много писалось на форуме про наименование процедур, таблиц и их использование.

попробуйте
cursor c_company_land is
    select cl.name from company_land cl;
6 ноя 13, 18:04    [15086547]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
PooH_2
кстати, о птичках! переименуй процедуру! у тебя не в таблице поле ищется, а локальная переменная в процедуре.


Спасибо, сделал согласно совету и все пошло.
6 ноя 13, 18:09    [15086570]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
K790
monstr76,

мне кажется у вас проблемы с именованием.
много писалось на форуме про наименование процедур, таблиц и их использование.

попробуйте
cursor c_company_land is
    select cl.name from company_land cl;


сделал после правильного именования процедуры, так как вы посоветовали, вернул назад, все работает одинаково.
6 ноя 13, 18:10    [15086577]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
получилось в конце вот так:
create or replace package body port is

-- выбор данных из company_land  
procedure p_company_land is

--  name_c varchar2(100); 
    name_c company_land.name%TYPE;   
     
  cursor c_company_land is
    select name from company_land;
      
   
  begin
    open c_company_land;
    
    LOOP 
    fetch c_company_land into name_c;
    
        if c_company_land%notfound 
            then 
              close c_company_land;
              exit;
            else
              dbms_output.put_line(name_c);
        end if;
    end loop;    
    
end p_company_land;  

end port;


СПАСИБО ВСЕМ!
6 ноя 13, 18:11    [15086584]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
K790
Member

Откуда:
Сообщений: 633
monstr76,

не мне, а PooH_2
6 ноя 13, 18:18    [15086606]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
monstr76
получилось в конце вот так:
create or replace package body port is

-- выбор данных из company_land  
procedure p_company_land is

--  name_c varchar2(100); 
    name_c company_land.name%TYPE;   
     
  cursor c_company_land is
    select name from company_land;
      
   
  begin
    open c_company_land;
    
    LOOP 
    fetch c_company_land into name_c;
    
        if c_company_land%notfound 
            then 
              close c_company_land;
              exit;
            else
              dbms_output.put_line(name_c);
        end if;
    end loop;    
    
end p_company_land;  

end port;

И чем это отличается от варианта из 15086447? Нет же ни одного отличия?
monstr76
переименовал процедуру, другая ошибка:
Compilation errors for PACKAGE BODY JUR.PORT

Error: PLS-00225: ссылка на подпрограмму или курсор 'COMPANY_LAND' вне области действия
Line: 24
Text: name_c company_land.name%TYPE;

procedure p_company_land is

--  name_c varchar2(100); 
    name_c company_land.name%TYPE; 
   
     
  cursor c_company_land is
    select name from company_land;
      
  begin
    open c_company_land;
    
    LOOP 
    fetch c_company_land into name_c;
    
        if c_company_land%notfound 
            then 
              close c_company_land;
              exit;
            else
              dbms_output.put_line(name_c);
        end if;
    end loop;    
    
end p_company_land;  
6 ноя 13, 18:18    [15086608]     Ответить | Цитировать Сообщить модератору
 Re: Объясните про %TYPE  [new]
monstr76
Member

Откуда:
Сообщений: 231
а тем что тут прописал правильное имя процедуры в пакете.
create or replace package port is

procedure p_company_land;

end port;
6 ноя 13, 18:24    [15086640]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить