Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Псевдофункция table. / 18 сообщений из 18, страница 1 из 1
03.05.2017, 08:38
    #39447666
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
Код: 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.
PROCEDURE relr(
    v_date    DATE,
    v_date2   DATE,
    v_inn varchar2)
AS
/*for v_inn's*/
  TYPE inn_list IS  TABLE OF VARCHAR2(25);
  l_data inn_list := inn_list();
  l_str LONG DEFAULT v_inn || ',';
  l_n NUMBER;

CURSOR t_data
    IS        
SELECT DISTINCT *
from table_a s
where
s.numnal IN (select column_name from table (l_data) )
;
BEGIN
/*for v_inn's*/
LOOP
    l_n := instr(l_str,',');
    EXIT  WHEN (NVL (l_n,0) = 0);
    l_data.extend;
    l_data(l_data.count):= ltrim(rtrim(SUBSTR(l_str,1,l_n-1)));
    l_str := SUBSTR (l_str, l_n + 1 );
  END LOOP;

.....

end relr;




при таком коде получаю ошибку
Код: plsql
1.
ORA-22905: cannot access rows from a non-nested table item



Знаю что псевдофункция TABLE не может использоваться с локально объявленным типом
коллекции, можно ли как-то обыграть такого плана говнокод, без создания типа уровня схемы?
...
Рейтинг: 0 / 0
03.05.2017, 08:54
    #39447674
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
...
Рейтинг: 0 / 0
03.05.2017, 12:45
    #39447798
arlx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
В 12 оракле в пакете можно объявлять тип, и потом использовать его так как вы хотите.
...
Рейтинг: 0 / 0
03.05.2017, 12:47
    #39447799
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
arlx,

К сожалению приходится пользоваться oracle 10g.
...
Рейтинг: 0 / 0
03.05.2017, 13:39
    #39447835
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
arlx,
прикинь, в 11 тоже работает....))) хитро правда))

saxarock
ну так поставь 12.
...
Рейтинг: 0 / 0
03.05.2017, 14:50
    #39447905
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
Vint,

Vintну так поставь 12.

Щаз пару бумажег согласую и поставлю.
...
Рейтинг: 0 / 0
03.05.2017, 15:11
    #39447927
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
saxarock,

вместо TYPE inn_list IS TABLE OF VARCHAR2(25)
ищите "системные" типы для Вашей версии

sys.ODCIVarchar2List
sys.dbms_debug_vc2coll
KU$_VCNT

.....
stax
...
Рейтинг: 0 / 0
03.05.2017, 15:26
    #39447945
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
к сожалению


Придется переосмыслить решение задачи.
...
Рейтинг: 0 / 0
03.05.2017, 15:59
    #39447988
Псевдофункция table.
stax..saxarock,

вместо TYPE inn_list IS TABLE OF VARCHAR2(25)
ищите "системные" типы для Вашей версии

sys.ODCIVarchar2List



И перепишите код, когда упретесь в ограничение 32к.
...
Рейтинг: 0 / 0
03.05.2017, 16:12
    #39447998
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
Больная мазольstax..saxarock,

вместо TYPE inn_list IS TABLE OF VARCHAR2(25)
ищите "системные" типы для Вашей версии

sys.ODCIVarchar2List



И перепишите код, когда упретесь в ограничение 32к.

не совсем понял
SQL> desc sys.dbms_debug_vc2coll
sys.dbms_debug_vc2coll TABLE OF VARCHAR2(1000)

я список как пример привел,
возможно есть подходящие типы и в прикладной схеме

напр ANE_CHAR_TABLE

.....
stax
...
Рейтинг: 0 / 0
03.05.2017, 16:21
    #39448008
Псевдофункция table.
stax.., ну я имел ввиду ODCIVarchar2List.

ODCIVarchar2List
Stores varrays of VARCHAR2s

Datatype

VARRAY(32767) OF VARCHAR2(4000)
...
Рейтинг: 0 / 0
03.05.2017, 16:47
    #39448028
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
Больная мазольstax.., ну я имел ввиду ODCIVarchar2List.

ODCIVarchar2List
Stores varrays of VARCHAR2s

Datatype

VARRAY(32767) OF VARCHAR2(4000)
согласен, надо обращать внимание что за тип

но для IN 32К в 90% должно хватать

зы
удивляюсь что нет стандартных public типов
(аля sys_refcursor - тож кажись не было)

.....
stax
...
Рейтинг: 0 / 0
03.05.2017, 17:22
    #39448049
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
Больная мазольИ перепишите код, когда упретесь в ограничение 32к.В приведенном контексте более 16К значений не будет.
...
Рейтинг: 0 / 0
04.05.2017, 10:04
    #39448417
arlx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
Vintarlx,
прикинь, в 11 тоже работает....))) хитро правда))
правда? а я думал будет ошибка
Error: PLS-00642: локальные типы коллекций не допускаются в операторах SQL

Тут тоже говорят про ошибку.
Поделишься знанием как это работало в 11?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create or replace package test is
	type t_type is table of number;
	function f_func return number;
end test;
/
create or replace package body test is
	function f_func return number is
		l number;
		t t_type := t_type();
	begin
		select rownum bulk collect into t from dual connect by level < 4;
		select count(1) into l from table(t);
		return l;
	end;
end test;
/
...
Рейтинг: 0 / 0
04.05.2017, 10:24
    #39448439
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
arlx,
pipelined function. Заполнение придумай сам.
Код: 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.
CREATE OR REPLACE PACKAGE DEV_INDICATOR IS
  TYPE tr_pipe_row IS RECORD(
     ID                      NUMBER);
  TYPE tt_pipe IS TABLE OF tr_pipe_row;
  /*-------------------------------------------------------------------------------------------------------------------------------------------------
  *-----------------------------------------------------------------------------------------------------------------------------------------------*/
  FUNCTION pipe_data(p_xml CLOB, p_oper_type VARCHAR2) RETURN tt_pipe
    PIPELINED;

END DEV_INDICATOR;
CREATE OR REPLACE PACKAGE BODY DEV_INDICATOR IS
  /*-----------------------------------------------------------------------------------------------------------------------------------------------*/
  FUNCTION pipe_data(p_xml CLOB, p_oper_type VARCHAR2) RETURN tt_pipe
    PIPELINED IS  
    pr_pipe          tr_pipe_row;
    pt_pipe          tt_pipe DEFAULT tt_pipe();
  BEGIN   
    /*-*/
    if pt_pipe.count > 0 then
      FOR i IN 1 .. pt_pipe.COUNT LOOP
        PIPE ROW(pt_pipe(i));
      END LOOP;
    end if;
  EXCEPTION
      when OTHERS then
      raise_application_error(-20000, dbms_utility.format_error_backtrace || ' error:' || SQLERRM);  
  END;
  /*-----------------------------------------------------------------------------------------------------------------------------------------------*/
END DEV_INDICATOR;

...
Рейтинг: 0 / 0
04.05.2017, 10:30
    #39448443
arlx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
Vint,

смысл уловил. спасибо)
...
Рейтинг: 0 / 0
04.05.2017, 12:13
    #39448597
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
Vintpipelined functionЭто хоть и удобный, но всё же синтаксический сахар по сокрытию неявно создающихся типов уровня схемы.
...
Рейтинг: 0 / 0
04.05.2017, 12:32
    #39448633
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Псевдофункция table.
Elic,
кто бы спорил))) там же целых 3 объекта создается. и есть 2 типа ошибок когда оракл не может создать один из объектов, либо один из объектов был явно удалён. но представь у меня вся система так написана. потому что так исторически сложилось)))
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Псевдофункция table. / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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