powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / непонятки с package
12 сообщений из 12, страница 1 из 1
непонятки с package
    #39637237
Ixtiander06
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри если глупый вопрос: впервые вожусь с package-ми, как-то раньше необходимости не было (в нашей конторе возможности оракла выходящие за рамки ANSI-SQL практически не используются :-/).

В общем вроде все сделал по методичке:
Код: 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.
SQL> CREATE OR REPLACE PACKAGE PKG22 AS 
  2  
  3      TYPE PKG22_TAB11 IS RECORD (
  4        SF1 VARCHAR2(4),
  5        SF2 VARCHAR2(4),
  6        SF3 VARCHAR2(10)
  7      );
  8  
  9      TYPE T_PKG22_TAB11 IS TABLE OF PKG22_TAB11;
 10  
 11       FUNCTION GET_TAB11_PE (
 12        VSKF1 IN VARCHAR2,
 13        VSKF2 IN VARCHAR2,
 14        VSKF3 IN VARCHAR2,
 15        VLF1 IN NUMBER,
 16        VLF2 IN NUMBER   
 17      ) RETURN T_PKG22_TAB11;
 18  
 19  END PKG22;
 20  /

Package created.

SQL> CREATE OR REPLACE PACKAGE BODY PKG22 AS 
  2  
  3    FUNCTION GET_TAB11_PE (
  4      VSKF1 IN VARCHAR2,
  5        VSKF2 IN VARCHAR2,
  6        VSKF3 IN VARCHAR2,
  7        VLF1 IN NUMBER,
  8        VLF2 IN NUMBER
  9    ) RETURN T_PKG22_TAB11  IS
 10  
 11      T T_PKG22_TAB11;
 12  
 13    BEGIN
 14  
 15     SELECT DISTINCT SF1,SF2,SF3 BULK COLLECT INTO T
 16     FROM TAB11  WHERE
 17    SKF1=VSKF1
 18    AND SKF2=VSKF2
 19    AND SKF3=VSKF3
 20    AND LD >= VLF1 AND LD <= VLF2;
 21    RETURN T;
 22    END GET_TAB11_PE;
 23  END PKG22;
 24  /
 
Package body created.



все нормально откомпилировалось. Пробую вызывать с неправильными аргументами:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG'));
select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG'))
                    *
ERROR at line 1:
ORA-06553: PLS-306: wrong number or types of arguments in call to 'GET_TAB11_PE'


SQL> select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG', 11111, 'aaa'));
select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG', 11111, 'aaa'))
                    *
ERROR at line 1:
ORA-00902: invalid datatype 


реагирует как и ожидалось. А теперь с правильными - и опаньки:

Код: plsql
1.
2.
3.
4.
5.
SQL> select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG', 11111, 22222));
select * from table(PKG22.GET_TAB11_PE('FMG','FMG', 'T2BAG', 11111, 22222))
                    *
ERROR at line 1:
ORA-00902: invalid datatype 


В чем же дело? И главное ошибка ORA-00902 - такая же как при неправильном типе последнего аргумента, так что непонятно, что именно ему не нравится???
...
Рейтинг: 0 / 0
непонятки с package
    #39637285
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ixtiander06что именно ему не нравится???PL/SQL record, как и PL/SQL collection из него не являются SQL-типами.
...
Рейтинг: 0 / 0
непонятки с package
    #39637293
Ixtiander06
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicIxtiander06что именно ему не нравится???PL/SQL record, как и PL/SQL collection из него не являются SQL-типами.

спасибо! А как же правильно сделать, чтобы функция возвращала таблицу, которую потом можно было использовать в SQL?
...
Рейтинг: 0 / 0
непонятки с package
    #39637304
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ixtiander06А как же правильно сделать, чтобы функция возвращала таблицу, которую потом можно было использовать в SQL?RTFM Table Function Concepts (FAQ)
...
Рейтинг: 0 / 0
непонятки с package
    #39637392
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ixtiander06Elicпропущено...
PL/SQL record, как и PL/SQL collection из него не являются SQL-типами.

спасибо! А как же правильно сделать, чтобы функция возвращала таблицу, которую потом можно было использовать в SQL?

Логика должна быть такая: сначала наполняем строковый объект, потом из строк наполняем табличный объект.
примерный пример (тавтология):
Код: 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 OR REPLACE PACKAGE BODY PKG22 AS 
  2  
  3    FUNCTION GET_TAB11_PE (
  4      VSKF1 IN VARCHAR2,
  5        VSKF2 IN VARCHAR2,
  6        VSKF3 IN VARCHAR2,
  7        VLF1 IN NUMBER,
  8        VLF2 IN NUMBER
  9    ) RETURN T_PKG22_TAB11  IS
 10  
    str PKG22_TAB11 : = (null, null, null);
 11      T T_PKG22_TAB11 : = T_PKG22_TAB11(); 
 12  
 13    BEGIN
 14  
   for i in (SELECT DISTINCT SF1,SF2,SF3 
 16     FROM TAB11  WHERE
 17    SKF1=VSKF1
 18    AND SKF2=VSKF2
 19    AND SKF3=VSKF3
     AND LD >= VLF1 AND LD <= VLF2) loop
        str.SF1 := i.SF1;
      str.SF2 := i.SF2;
      str.SF3 := i.SF3;
      t.extend;
      t(t.last) := str;
    end loop;
 21    RETURN T;
 22    END GET_TAB11_PE;
 23  END PKG22;
...
Рейтинг: 0 / 0
непонятки с package
    #39637413
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelпримерный примерТы сделал то же самое, только используя говнокод.
...
Рейтинг: 0 / 0
непонятки с package
    #39637430
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicFogelпримерный примерТы сделал то же самое, только используя говнокод.
нет, не то же самое.
про говнокод - зато логика понятна, что делать.
...
Рейтинг: 0 / 0
непонятки с package
    #39637434
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelнет, не то же самое.То же, то же.
Fogelзато логика понятна,Нет там никакой логики. А поскольку то же, то всё рано работать не будет.
...
Рейтинг: 0 / 0
непонятки с package
    #39637490
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicFogelнет, не то же самое.То же, то же.
Fogelзато логика понятна,Нет там никакой логики. А поскольку то же, то всё рано работать не будет.
была, пока ты не пришёл ))
пришлось вспоминать.
Ixtiander06, для табличных функций на вход нужно курсор передавать, а не отдельные значения
или, что проще, потоковую функцию делать, типа такого:
Код: 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.
CREATE OR REPLACE PACKAGE PKG22 AS

  TYPE PKG22_TAB11 IS RECORD(
    SF1 VARCHAR2(4),
    SF2 VARCHAR2(4),
    SF3 VARCHAR2(10));

  TYPE T_PKG22_TAB11 IS TABLE OF PKG22_TAB11;

  FUNCTION GET_TAB11_PE(VSKF1 IN VARCHAR2,
                        VSKF2 IN VARCHAR2,
                        VSKF3 IN VARCHAR2,
                        VLF1  IN NUMBER,
                        VLF2  IN NUMBER) RETURN T_PKG22_TAB11
    pipelined;

END PKG22;
/
CREATE OR REPLACE PACKAGE BODY PKG22 AS

  FUNCTION GET_TAB11_PE(VSKF1 IN VARCHAR2,
                        VSKF2 IN VARCHAR2,
                        VSKF3 IN VARCHAR2,
                        VLF1  IN NUMBER,
                        VLF2  IN NUMBER) RETURN T_PKG22_TAB11
    pipelined IS
  
  BEGIN
    for i in (SELECT DISTINCT SF1,SF2,SF3 BULK COLLECT INTO T
     FROM TAB11  WHERE
   SKF1=VSKF1
   AND SKF2=VSKF2
    AND SKF3=VSKF3
  AND LD >= VLF1 AND LD <= VLF2) loop
      pipe row(i);
    end loop;
  END GET_TAB11_PE;
END PKG22;


PS: Elic наверняка ещё 20 с хвостиком способов знает, но фиг поделится.
...
Рейтинг: 0 / 0
непонятки с package
    #39637499
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogel
Код: sql
1.
2.
3.
4.
5.
6.
for i in (SELECT DISTINCT SF1,SF2,SF3 BULK COLLECT INTO T
     FROM TAB11  WHERE
   SKF1=VSKF1
   AND SKF2=VSKF2
    AND SKF3=VSKF3
  AND LD >= VLF1 AND LD <= VLF2) loop




Ты бы кофе попил...

SY.
...
Рейтинг: 0 / 0
непонятки с package
    #39637501
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYFogel
Код: sql
1.
2.
3.
4.
5.
6.
for i in (SELECT DISTINCT SF1,SF2,SF3 BULK COLLECT INTO T
     FROM TAB11  WHERE
   SKF1=VSKF1
   AND SKF2=VSKF2
    AND SKF3=VSKF3
  AND LD >= VLF1 AND LD <= VLF2) loop




Ты бы кофе попил...

SY.
копипаста, конечно без этого
...
Рейтинг: 0 / 0
непонятки с package
    #39637552
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ixtiander06,
А так не устроит?
Код: 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.
CREATE OR REPLACE
TYPE TARIFDBA.PKG22_TAB11 AS OBJECT (
SF1 VARCHAR2(4),
SF2 VARCHAR2(4),
SF3 VARCHAR2(10));
/
CREATE OR REPLACE
TYPE TARIFDBA.T_PKG22_TAB11 IS TABLE OF PKG22_TAB11;
/
CREATE OR REPLACE PACKAGE TARIFDBA.PKG22 AS 
 
       FUNCTION GET_TAB11_PE RETURN T_PKG22_TAB11;
END PKG22;
/
CREATE OR REPLACE PACKAGE BODY TARIFDBA.PKG22 AS 
 
FUNCTION GET_TAB11_PE RETURN T_PKG22_TAB11  IS
  
      T T_PKG22_TAB11;
BEGIN
  WITH TAB AS
  (SELECT 'x' SF1, 'y' SF2,'z' SF3 from dual
   union 
   select 'dx' , 'dy' ,'dz' from dual)
  SELECT PKG22_TAB11(SF1,SF2,SF3) 
  BULK COLLECT INTO T
     FROM TAB ;
    RETURN T;
    END GET_TAB11_PE;
END PKG22;
/
select *
 from table (PKG22.GET_TAB11_PE)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / непонятки с package
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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