Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / 11.2 dbms_sql put array / 10 сообщений из 10, страница 1 из 1
21.07.2020, 11:37
    #39982161
Cheese)))
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
11.2 dbms_sql put array
Можно ли в 11.2 через dbms_sql передать массив, не bulk операцией (как через dbms_sql.bind_array), а именно как массив?
С использованием bind_variable_pkg в 12c получается, но в 11.2 bind_variable_pkg нет.

Вот такое хотелось бы
Код: 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.
declare
  x dbms_sql.Number_Table;
  y dbms_sql.Number_Table;
  c number;
  r number;
  stmt varchar2(10000);
  col1     DBMS_SQL.NUMBER_TABLE;
  
  n1 NUMBER;
  n2 NUMBER;  
begin
  x(1):= 1;
  x(2):= 2;
  y(1):= 1;
  y(2):= 2;
 
  stmt := '
with t as (
  select 1 a, 1 b from dual union all
  select 1 a, 2 b from dual union all
  select 2 a, 1 b from dual union all
  select 2 a, 2 b from dual
)
select * from t
where a in (select column_value from table(:x))
  and b in (select column_value from table(:y))';
  c := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(c, stmt, DBMS_SQL.NATIVE);
  DBMS_SQL.bind_variable_pkg(c, 'x', x);
  DBMS_SQL.bind_variable_pkg(c, 'y', y);

  r := DBMS_SQL.EXECUTE(c);

  DBMS_SQL.DEFINE_COLUMN(c, 1, n1);   
  DBMS_SQL.DEFINE_COLUMN(c, 2, n2);  
  
  LOOP 
    IF DBMS_SQL.FETCH_ROWS(c) > 0 THEN 
       DBMS_SQL.COLUMN_VALUE(c, 1, n1); 
       DBMS_SQL.COLUMN_VALUE(c, 2, n2); 
       DBMS_OUTPUT.PUT_LINE('n1 = '||n1||' n2 = '||n2); 
    ELSE 
       EXIT; 
    END IF; 
  END LOOP; 
  
  DBMS_SQL.CLOSE_CURSOR(c);
end;
...
Рейтинг: 0 / 0
21.07.2020, 13:13
    #39982197
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
11.2 dbms_sql put array
Hет. Используй 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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
SQL> set serveroutput on
SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for 64-bit Windows: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

SQL> declare
  2    x sys.OdciNumberList := sys.OdciNumberList();
  3    y sys.OdciNumberList := sys.OdciNumberList();
  4    c number;
  5    r number;
  6    stmt varchar2(10000);
  7    n1 NUMBER;
  8    n2 NUMBER;
  9  begin
 10    x.extend(2);
 11    x(1):= 1;
 12    x(2):= 2;
 13    y.extend(2);
 14    y(1):= 1;
 15    y(2):= 2;
 16
 17    stmt := '
 18  with t as (
 19    select 1 a, 1 b from dual union all
 20    select 1 a, 2 b from dual union all
 21    select 2 a, 1 b from dual union all
 22    select 2 a, 2 b from dual
 23  )
 24  select * from t
 25  where a in (select column_value from table(:x))
 26    and b in (select column_value from table(:y))';
 27    c := DBMS_SQL.OPEN_CURSOR;
 28    DBMS_SQL.PARSE(c, stmt, DBMS_SQL.NATIVE);
 29    DBMS_SQL.bind_variable(c, 'x', x);
 30    DBMS_SQL.bind_variable(c, 'y', y);
 31
 32    r := DBMS_SQL.EXECUTE(c);
 33
 34    DBMS_SQL.DEFINE_COLUMN(c, 1, n1);
 35    DBMS_SQL.DEFINE_COLUMN(c, 2, n2);
 36
 37    LOOP
 38      IF DBMS_SQL.FETCH_ROWS(c) > 0 THEN
 39         DBMS_SQL.COLUMN_VALUE(c, 1, n1);
 40         DBMS_SQL.COLUMN_VALUE(c, 2, n2);
 41         DBMS_OUTPUT.PUT_LINE('n1 = '||n1||' n2 = '||n2);
 42      ELSE
 43         EXIT;
 44      END IF;
 45    END LOOP;
 46
 47    DBMS_SQL.CLOSE_CURSOR(c);
 48  end;
 49  /
n1 = 1 n2 = 2
n1 = 1 n2 = 1
n1 = 2 n2 = 2
n1 = 2 n2 = 1

PL/SQL procedure successfully completed.

SQL>



SY.
...
Рейтинг: 0 / 0
21.07.2020, 13:37
    #39982214
Cheese)))
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
11.2 dbms_sql put array
Спасибо!
...
Рейтинг: 0 / 0
21.07.2020, 19:38
    #39982373
Cheese)))
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
11.2 dbms_sql put array
Такой еще вопрос:
если в sql пишу
Код: plsql
1.
and t.id in (select column_value from table(:id_list))



dbms_sql.excute отрабатывает, но по такому SQL потом не получить план, получаю ошибку
ORA-22905: невозможно получить доступ к строкам элемента, не являющегося вложенной таблицей

если явно указать тип
Код: plsql
1.
and t.id in (select column_value from table(number_array(:id_list)))


то уже наоборот, план получаю, а dbms_sql.excute говорит
ORA-00932: несовместимые типы данных: ожидается NUMBER, получено NUMBER_ARRAY
ORA-06512: на "SYS.DBMS_SQL", line 1825
ORA-06512: на line 27

как бы обоим угодить?
...
Рейтинг: 0 / 0
21.07.2020, 19:52
    #39982377
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
11.2 dbms_sql put array
Код приведи.

SY.
...
Рейтинг: 0 / 0
21.07.2020, 20:03
    #39982379
Cheese)))
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
11.2 dbms_sql put array
Код: 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.
create or replace type number_array is table of number
/

declare
  x number_array := number_array(1,2);
  c number;
  r number;
  stmt varchar2(10000);
  n1 NUMBER;
begin
  stmt := '
with t as (
  select 1 id from dual
)
select * from t
where id in (select column_value from table(number_array(:x)))';
  c := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(c, stmt, DBMS_SQL.NATIVE);
  DBMS_SQL.bind_variable(c, 'x', x);

  r := DBMS_SQL.EXECUTE(c);

  DBMS_SQL.DEFINE_COLUMN(c, 1, n1);

  LOOP
    IF DBMS_SQL.FETCH_ROWS(c) > 0 THEN
       DBMS_SQL.COLUMN_VALUE(c, 1, n1);
       DBMS_OUTPUT.PUT_LINE('n1 = '||n1);
    ELSE
       EXIT;
    END IF;
  END LOOP;

  DBMS_SQL.CLOSE_CURSOR(c);
end;
/
...
Рейтинг: 0 / 0
21.07.2020, 20:30
    #39982388
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
11.2 dbms_sql put array
Cheese)))
Код: plsql
1.
and t.id in (select column_value from table(number_array(:id_list)))


то уже наоборот, план получаю, а dbms_sql.excute говорит
ORA-00932: несовместимые типы данных: ожидается NUMBER, получено NUMBER_ARRAY

Правильно говорит.
Нет у Вас копирующего конструктора, оно и ругается.
Попробуйте вместо вызова конструктора в запросе использовать cast (:id_list as number_array)
...
Рейтинг: 0 / 0
21.07.2020, 20:42
    #39982392
Cheese)))
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
11.2 dbms_sql put array
Спасибо, работает!
А что есть "копирующий конструктор"?
...
Рейтинг: 0 / 0
21.07.2020, 21:35
    #39982413
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
11.2 dbms_sql put array
Cheese)))
Спасибо, работает!
А что есть "копирующий конструктор"?

https://bfy.tw/OYop
...
Рейтинг: 0 / 0
21.07.2020, 21:51
    #39982418
Cheese)))
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
11.2 dbms_sql put array
andrey_anonymous,

Я пытался искать применительно oracle type так "oracle type copy constructor" и что-то ничего.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / 11.2 dbms_sql put array / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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