powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / 11.2 dbms_sql put array
10 сообщений из 10, страница 1 из 1
11.2 dbms_sql put array
    #39982161
Cheese)))
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли в 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
11.2 dbms_sql put array
    #39982197
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
11.2 dbms_sql put array
    #39982214
Cheese)))
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
...
Рейтинг: 0 / 0
11.2 dbms_sql put array
    #39982373
Cheese)))
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой еще вопрос:
если в 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
11.2 dbms_sql put array
    #39982377
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код приведи.

SY.
...
Рейтинг: 0 / 0
11.2 dbms_sql put array
    #39982379
Cheese)))
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
11.2 dbms_sql put array
    #39982388
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
11.2 dbms_sql put array
    #39982392
Cheese)))
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, работает!
А что есть "копирующий конструктор"?
...
Рейтинг: 0 / 0
11.2 dbms_sql put array
    #39982413
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheese)))
Спасибо, работает!
А что есть "копирующий конструктор"?

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

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


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