powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Sql package
25 сообщений из 31, страница 1 из 2
Sql package
    #40030899
DoroNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Возникла ошибка при создании тела пакета.

Вот специфика пакета
Код: plsql
1.
2.
3.
4.
5.
6.
7.
create or replace package pack
 as
function Fun1 (fu IN NUMBER)
return VARCHAR2;
procedure proc(id_tank NUMBER, name_tank VARCHAR2);
end;
/



Вот тело пакета
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create or replace package body pack as
function Fun1 (fu IN NUMBER)
return VARCHAR2
as
const VARCHAR2(64);
begin
    select name_tank into const from tank where tank.id_tank = Fun1.fu;
    return const;
exception
    when no_data_found THEN
        dbms_output.put_line('___Invalid!');
end Fun1;
procedure proc(id_tank NUMBER, name_tank VARCHAR2)
as
begin
    insert into tank values (proc.id_tank, proc.name_tank);
end;
end pack;
/



Функция для получения данных и записи их в переменную const
Процедура для добавления записи в таблицу танк.

Тело создается с ошибками компиляции, но я не могу их найти. Пожалуйста, подскажите. Заранее спасибо
...
Рейтинг: 0 / 0
Sql package
    #40030905
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 
Connected as system@ORCL

SQL> 
SQL> create or replace package pack
  2   as
  3  function Fun1 (fu IN NUMBER)
  4  return VARCHAR2;
  5  procedure proc(id_tank NUMBER, name_tank VARCHAR2);
  6  end;
  7  /

Package created


SQL> 
SQL> create or replace package body pack as
  2  function Fun1 (fu IN NUMBER)
  3  return VARCHAR2
  4  as
  5  const VARCHAR2(64);
  6  begin
  7      select name_tank into const from tank where tank.id_tank = Fun1.fu;
  8      return const;
  9  exception
 10      when no_data_found THEN
 11          dbms_output.put_line('___Invalid!');
 12  end Fun1;
 13  procedure proc(id_tank NUMBER, name_tank VARCHAR2)
 14  as
 15  begin
 16      insert into tank values (proc.id_tank, proc.name_tank);
 17  end;
 18  end pack;
 19  /

Warning: Package body created with compilation errors


SQL> show errors;
Errors for PACKAGE BODY SYSTEM.PACK:
LINE/COL ERROR
-------- -----------------------------------------------
7/38     PL/SQL: ORA-00942: table or view does not exist
7/5      PL/SQL: SQL Statement ignored
16/17    PL/SQL: ORA-00942: table or view does not exist
16/5     PL/SQL: SQL Statement ignored

SQL> 

...
Рейтинг: 0 / 0
Sql package
    #40030906
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoroNik,

В user_errors поищи
...
Рейтинг: 0 / 0
Sql package
    #40030911
DoroNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

LINE/COL ERROR
-------- -----------------------------------------------------------------
16/5 PL/SQL: SQL Statement ignored
16/17 PL/SQL: ORA-00947: not enough values

Вот что мне выдаёт show errors
И я не знаю как их исправить.
...
Рейтинг: 0 / 0
Sql package
    #40030914
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoroNik,

В таблице с цистернами всего два поля или всё-таки есть ещё?

упд. хорошей практикой считается явно указывать поля для любого оператора
Код: plsql
1.
insert into t(a, b, c) values(:a, :b, :c)
...
Рейтинг: 0 / 0
Sql package
    #40030915
DoroNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env, полей больше двух, но мне нужно внести именно в два - в id_tank и name_tank.
...
Рейтинг: 0 / 0
Sql package
    #40030923
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoroNik
env, полей больше двух, но мне нужно внести именно в два - в id_tank и name_tank.


нужные поля нужно перечислить в скобках

insert into tank ( поля таблицы через запятую в томе же порядке что в values 1:1) values ....
...
Рейтинг: 0 / 0
Sql package
    #40030928
DoroNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenab, Я сохранил порядок полей, но ошибка всё равно.
...
Рейтинг: 0 / 0
Sql package
    #40030936
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoroNik
ошибка всё равно.


Давайте уже полный листинг, а не "подземный стук".
...
Рейтинг: 0 / 0
Sql package
    #40030939
DoroNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm, что именно вам нужно, перечислите, пожалуйста
...
Рейтинг: 0 / 0
Sql package
    #40030965
DoroNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

SQL> show errors;
Errors for PACKAGE BODY PACK:

LINE/COL ERROR
-------- -----------------------------------------------------------------
16/5 PL/SQL: SQL Statement ignored
16/17 PL/SQL: ORA-00947: not enough values

Вы про это? Или вам нужны таблицы?
...
Рейтинг: 0 / 0
Sql package
    #40030974
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoroNik,

А как ты думаешь?
Код: 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.
SQL> create table tank ( id_tank number, tank_name varchar2(30), owner varchar2(30));

Table created.

SQL> with
function Fun1 (fu IN NUMBER)
return VARCHAR2
as
const VARCHAR2(64);
begin
    select tank_name into const from tank where tank.id_tank = Fun1.fu;
    return const;
exception
    when no_data_found THEN
        dbms_output.put_line('___Invalid!');
        return null;
end Fun1;

procedure proc(p_id_tank NUMBER, p_name_tank VARCHAR2)
as
begin
    insert into tank (id_tank, tank_name) values (proc.p_id_tank, proc.p_name_tank);
end proc;
select fun1(1) from dual;
/
SQL> /

FUN1(1)
--------------------------------------------------------------------------------
name1
...
Рейтинг: 0 / 0
Sql package
    #40030978
DoroNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,
Извините, но я не понял вас. В чём ошибка?
...
Рейтинг: 0 / 0
Sql package
    #40030983
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoroNik
Vadim Lejnin,
Извините, но я не понял вас. В чём ошибка?


Код: plsql
1.
2.
3.
4.
5.
6.
7.
procedure proc(p_id_tank NUMBER, p_name_tank VARCHAR2)
as
begin
    insert into tank (id_tank, tank_name) values (proc.p_id_tank, proc.p_name_tank);
end proc;
select fun1(1) from dual;
/
...
Рейтинг: 0 / 0
Sql package
    #40030988
DoroNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
procedure proc(id_tank NUMBER, name_tank VARCHAR2)
as
begin
    insert into tank values (proc.id_tank, proc.name_tank);
end;
end pack;
/



У меня они написаны одинаково и поля совпадают с созданной мной таблицей. В этом ошибка или в другом? Ошибка в proc.id_tank и proc.name_tank ? Я делал по примерам других и у них всё работало.
...
Рейтинг: 0 / 0
Sql package
    #40030995
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если число и/или порядок значений в VALUES не совпадает с числом и/или порядком полей таблицы то поля необходимо явно указать:

Код: plsql
1.
insert into tank(список-полей) values (id_tank,name_tank);



SY.
...
Рейтинг: 0 / 0
Sql package
    #40031033
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoroNikчто именно вам нужно, перечислите, пожалуйста

Полный листинг операций, пример я привел в первом ответе вам. Желательно также приводить DDL таблиц, которые есть только у вас, чтобы другому человеку можно было воспроизвести ваш код путем простого Ctrl+C/Ctrl+V.

Без этого можно долго объяснять отсебятину ("от себя"):

DoroNikУ меня они написаны

DoroNikВ этом ошибка или в другом?
...
Рейтинг: 0 / 0
Sql package
    #40031180
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoroNik,
не нужно указывать имя процедуры/функции при обращении к их параметрам внутри их тела.
...
Рейтинг: 0 / 0
Sql package
    #40031182
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем так категорично?
Egoр
DoroNik,
не нужно Можно не указывать имя процедуры/функции при обращении к их параметрам внутри их тела.
...
Рейтинг: 0 / 0
Sql package
    #40031206
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoroNik,

и зря вы нарываетесь используя ( всуе :) RESERVED_WORDS
Код: plsql
1.
select * from SYS.V_$RESERVED_WORDS A where KEYWORD like 'CONST';
...
Рейтинг: 0 / 0
Sql package
    #40031637
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawish
DoroNik,

и зря вы нарываетесь используя ( всуе :) RESERVED_WORDS
Код: plsql
1.
select * from SYS.V_$RESERVED_WORDS A where KEYWORD like 'CONST';


А что здесь не так?
Почему нельзя использовать CONST?

Код: 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.
SQL> SELECT banner_full FROM V$VERSION;

BANNER_FULL                                                                                                                                                     
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.4.0.0.0


SQL> COLUMN keyword FORMAT A20;
SQL> COLUMN RESERVED FORMAT A9;
SQL> COLUMN RES_TYPE FORMAT A9;
SQL> COLUMN RES_ATTR FORMAT A9;
SQL> COLUMN RES_SEMI FORMAT A9;
SQL> COLUMN DUPLICATE FORMAT A9;

SQL> select KEYWORD -- VARCHAR2(128) Name of the keyword
  2       , LENGTH -- NUMBER Length of the keyword
  3       , RESERVED -- VARCHAR2(1) Indicates whether the keyword 
  4                  -- cannot be used as an identifier (Y) or 
  5                  -- whether the keyword is not reserved (N)
  6       , RES_TYPE -- VARCHAR2(1) Indicates whether the keyword 
  7                  -- cannot be used as a type name (Y) or 
  8                  -- whether the keyword is not reserved (N)
  9       , RES_ATTR -- VARCHAR2(1) Indicates whether the keyword 
 10                  -- cannot be used as an attribute name (Y) or 
 11                  -- whether the keyword is not reserved (N)
 12       , RES_SEMI -- VARCHAR2(1) Indicates whether the keyword 
 13                  -- is not allowed as an identifier 
 14                  -- in certain situations, such as in DML (Y) or 
 15                  -- whether the keyword is not reserved (N)
 16       , DUPLICATE -- VARCHAR2(1) Indicates whether the keyword 
 17                  -- is a duplicate of another keyword (Y) or 
 18                  -- whether the keyword is not a duplicate (N)
 19  from SYS.V_$RESERVED_WORDS A where KEYWORD like 'CONST';

KEYWORD                  LENGTH RESERVED  RES_TYPE  RES_ATTR  RES_SEMI  DUPLICATE
-------------------- ---------- --------- --------- --------- --------- ---------
CONST                         5 N         N         N         N         N        

SQL> CREATE TABLE CONST(
  2     PURGE VARCHAR2(1)
  3   , LINK NUMBER
  4   , DATA DATE);

Table CONST created.
...
Рейтинг: 0 / 0
Sql package
    #40031652
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus
А что здесь не так?
Почему нельзя использовать CONST?
Практикующие админы и разработчики стараются так не делать, чтобы не раскладывать грабли в возможных будущих миграциях/апгрейдах етс. А всякие почитатели ORM и прочие теоретики делают недоуменные лица и недоверчиво блеют - страа-а-нно, у нас все работало(с), когда им говоришь, что миграция их БД упала. И упала потому, что поле назвали date и скрипт-мигратор не смог правильно создать имя констрейнта на основе окавыченного "date" в промежуточной таблице. И тебе ночью, сидя у заказчика, пришлось руками исправлять скрипт и запускать с места падения. А с утра вся эта выспавшаяся вертикаль власти на митинге, сидя с недовольными лицами, говорит тебе, что считали тебя профессионалом, способным нарисовать сколько то там перепендикулярных линий. А ты молчишь и становишься мизантропом. Поэтому, Валерий, так делать можно, но не нужно.
ЗЫ. не надо спрашивать про тестирование.
...
Рейтинг: 0 / 0
Sql package
    #40031706
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oragraf
SQL*Plus
А что здесь не так?
Почему нельзя использовать CONST?
Практикующие админы и разработчики стараются так не делать, чтобы не раскладывать грабли в возможных будущих миграциях/апгрейдах етс. А всякие почитатели ORM и прочие теоретики делают недоуменные лица и недоверчиво блеют - страа-а-нно, у нас все работало(с), когда им говоришь, что миграция их БД упала. И упала потому, что поле назвали date и скрипт-мигратор не смог правильно создать имя констрейнта на основе окавыченного "date" в промежуточной таблице. И тебе ночью, сидя у заказчика, пришлось руками исправлять скрипт и запускать с места падения. А с утра вся эта выспавшаяся вертикаль власти на митинге, сидя с недовольными лицами, говорит тебе, что считали тебя профессионалом, способным нарисовать сколько то там перепендикулярных линий. А ты молчишь и становишься мизантропом. Поэтому, Валерий, так делать можно, но не нужно.
ЗЫ. не надо спрашивать про тестирование.


И что теперь? Все поля называть по-русски? Или как?
WHEN_BYLO, DATA_POLUCH, PRIZNAK_READY :-)

А вдруг Оракл начнет все поля переводить на русский?
Опять же будет неожиданные ошибки.

Может лучше не программировать на этой Оракле?! :-)
...
Рейтинг: 0 / 0
Sql package
    #40031737
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oragraf,

спасибо, всё так
...
Рейтинг: 0 / 0
Sql package
    #40031755
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oragraf
SQL*Plus
А что здесь не так?
Почему нельзя использовать CONST?
Практикующие админы и разработчики стараются так не делать, чтобы не раскладывать грабли в возможных будущих миграциях/апгрейдах етс. А всякие почитатели ORM и прочие теоретики делают недоуменные лица и недоверчиво блеют - страа-а-нно, у нас все работало(с), когда им говоришь, что миграция их БД упала. И упала потому, что поле назвали date и скрипт-мигратор не смог правильно создать имя констрейнта на основе окавыченного "date" в промежуточной таблице. И тебе ночью, сидя у заказчика, пришлось руками исправлять скрипт и запускать с места падения. А с утра вся эта выспавшаяся вертикаль власти на митинге, сидя с недовольными лицами, говорит тебе, что считали тебя профессионалом, способным нарисовать сколько то там перепендикулярных линий. А ты молчишь и становишься мизантропом. Поэтому, Валерий, так делать можно, но не нужно.
ЗЫ. не надо спрашивать про тестирование.
упал самописный мигратор, а виноват кто-то другой
А упал по сути не из-за конкретного названия "date", а из-за названия поля в кавычках
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Sql package
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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