Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Перечислить колонки в %rowtype  [new]
Vlad2014
Member

Откуда:
Сообщений: 4
Добрый день!

Как можно перечислить все поля в %rowtype переменной?

Т.е. есть PL/SQL переменная типа
  procedure StorePerson2Java(rowPerson IN PERSON%rowtype) is

при этом набор полей может менятся, hard-code`ить крайне нежелательно!

А нужно каждое поле передать в Java код...

Т.е. сделать что-то типа
for c in (волшебный select) loop
  dbms_output.put_line(c.название || c.значение)
end loop;

Альтернатива - передать в Java код весь %rowtype, но это, насколько я понимаю, практически невозможно...

Заранее спасибо за ответы!
14 мар 14, 10:29    [15722176]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
123йй
Member

Откуда:
Сообщений: 1637
Vlad2014
при этом набор полей может менятся

наказать того кто меняет таблицу
14 мар 14, 10:57    [15722348]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9242
select ... from user_tab_columns where table_name='PERSON' order by ...

и дальше разбираться )))
14 мар 14, 11:10    [15722441]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
Vlad2014
Member

Откуда:
Сообщений: 4
123йй, совет наказать меняющего - это конечно прекрасно ;-) но не катит. Мысль "не делать через это место" понятна, непонятно как делать...

Leonid Kudryavtsev, да user_tab_columns первое что пришло в голову, но как быть, если входящий параметр %rowtype?
Его же даже в execute immediate не передашь, не говоря уже что это будет сильно медленно.
Т.е. тут бы что-то типа dbms_cursor.describe, но как?
18 мар 14, 14:58    [15746074]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
кит северных морей
Member

Откуда: krsk / nyc / krsk
Сообщений: 881
Vlad2014,

19:33:00 (538)LKU@dwal> create procedure t ( p tab%rowtype ) as begin null; end;
19:33:28   2  /

Procedure created.

Elapsed: 00:00:00.01
19:33:33 (538)LKU@dwal> @descr
Position    Name        DTY  Mode
1           P           250  0
1           TNAME       1    0
2           TABTYPE     1    0
3           CLUSTERID   2    0

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01

+ DBMS_DESCRIBE, из доки
19:33:40 (538)LKU@dwal> l
  1    declare
  2     overload     DBMS_DESCRIBE.NUMBER_TABLE;
  3        position     DBMS_DESCRIBE.NUMBER_TABLE;
  4        c_level      DBMS_DESCRIBE.NUMBER_TABLE;
  5        arg_name     DBMS_DESCRIBE.VARCHAR2_TABLE;
  6        dty          DBMS_DESCRIBE.NUMBER_TABLE;
  7        def_val      DBMS_DESCRIBE.NUMBER_TABLE;
  8        p_mode       DBMS_DESCRIBE.NUMBER_TABLE;
  9        length       DBMS_DESCRIBE.NUMBER_TABLE;
 10        precision    DBMS_DESCRIBE.NUMBER_TABLE;
 11        scale        DBMS_DESCRIBE.NUMBER_TABLE;
 12        radix        DBMS_DESCRIBE.NUMBER_TABLE;
 13        spare        DBMS_DESCRIBE.NUMBER_TABLE;
 14        idx          INTEGER := 0;
 15   PROCEDURE prt_value(val VARCHAR2, isize INTEGER) IS
 16      n INTEGER;
 17    BEGIN
 18      n := isize - LENGTHB(val);
 19      IF n < 0 THEN
 20        n := 0;
 21      END IF;
 22      DBMS_OUTPUT.PUT(val);
 23      FOR i in 1..n LOOP
 24        DBMS_OUTPUT.PUT(' ');
 25      END LOOP;
 26    END prt_value;
 27    BEGIN
 28        DBMS_DESCRIBE.DESCRIBE_PROCEDURE(
 29                'T',
 30                null,
 31                null,
 32                overload,
 33                position,
 34                c_level,
 35                arg_name,
 36                dty,
 37                def_val,
 38                p_mode,
 39                length,
 40                precision,
 41                scale,
 42                radix,
 43                spare);
 44        DBMS_OUTPUT.PUT_LINE('Position    Name        DTY  Mode');
 45        LOOP
 46            idx := idx + 1;
 47            prt_value(TO_CHAR(position(idx)), 12);
 48            prt_value(arg_name(idx), 12);
 49            prt_value(TO_CHAR(dty(idx)), 5);
 50            prt_value(TO_CHAR(p_mode(idx)), 5);
 51            DBMS_OUTPUT.NEW_LINE;
 52        END LOOP;
 53   EXCEPTION
 54       WHEN NO_DATA_FOUND THEN
 55          DBMS_OUTPUT.NEW_LINE;
 56          DBMS_OUTPUT.NEW_LINE;
 57*   end;
18 мар 14, 15:37    [15746528]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
кит северных морей
Member

Откуда: krsk / nyc / krsk
Сообщений: 881
Vlad2014,

невнимательно прочитал. ответ выше вам ничего не даст.
18 мар 14, 15:41    [15746570]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
123йй
Member

Откуда:
Сообщений: 1637
кит северных морей,
где-то рядом :)
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
SQL> 
SQL> create or replace function f1(r all_objects%rowtype)
  2     return number
  3  as
  4  begin
  5     return 1e10;
  6  end f;
  7  /
 
Function created
SQL> select object_name, argument_name, pls_type from user_arguments where object_name = 'F1'
  2  /
 
OBJECT_NAME                    ARGUMENT_NAME                  PLS_TYPE
------------------------------ ------------------------------ ------------------------------
F1                              SECONDARY                      VARCHAR2
F1                             GENERATED                      VARCHAR2
F1                              TEMPORARY                      VARCHAR2
F1                              STATUS                         VARCHAR2
F1                             TIMESTAMP                      VARCHAR2
F1                              LAST_DDL_TIME                  DATE
F1                              CREATED                        DATE
F1                              OBJECT_TYPE                    VARCHAR2
F1                              DATA_OBJECT_ID                 NUMBER
F1                              OBJECT_ID                      NUMBER
F1                              SUBOBJECT_NAME                 VARCHAR2
F1                              OBJECT_NAME                    VARCHAR2
F1                              OWNER                          VARCHAR2
F1                             R                              
F1                                                             NUMBER
 
15 rows selected
 
SQL> 
18 мар 14, 15:48    [15746657]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
кит северных морей
Member

Откуда: krsk / nyc / krsk
Сообщений: 881
123йй,

суть не меняется :)

ТС,

динамически перебрать rowtype можно только одним способом - глобальная переменная в спеке пакета. хотите динамики - create type + anydata + anytype.
18 мар 14, 16:00    [15746800]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
123йй
Member

Откуда:
Сообщений: 1637
кит северных морей,

Том
18 мар 14, 16:18    [15747002]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
кит северных морей
Member

Откуда: krsk / nyc / krsk
Сообщений: 881
123йй,

эм...

ops$tkyte@ORA817DEV.US.ORACLE.COM> create or replace package demo_pkg
  2  as
  3      emp_rec   emp%rowtype;
  4  
  5      -- other records here for other tables
  6  end;
  7  /


а я что сказал? :)
18 мар 14, 16:26    [15747084]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
123йй
Member

Откуда:
Сообщений: 1637
кит северных морей,

а я и не возражал :) это как раз то что и просил ТС
18 мар 14, 16:40    [15747206]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
Vlad2014
Member

Откуда:
Сообщений: 4
123йй, спасибо! Не нашел этого на AskTom

Вот только нужно быстро передавать немаленький объем данных в Java код, есть у меня сомнения что execute immediate и последующий вызов Java функции чтобы сохранить одно поле будет достаточно быстро.
Полей пара сотен, записей много (ногами не бейте - не я делал структуру таблицы).
Впрочем, проверю, посмотрим...

Т.к. конечная задача именно передать %rowtype в Java процедуру на сервере, как это лучше сделать? Только JPublisher или есть способы проще / лучше?
На стороне Java вполне устроит HashMap поле-значение для переданного %rowtype.
18 мар 14, 17:30    [15747669]     Ответить | Цитировать Сообщить модератору
 Re: Перечислить колонки в %rowtype  [new]
-2-
Member

Откуда:
Сообщений: 15330
Vlad2014
Только JPublisher
До 12с jdbc не поддерживает plsql-типов. jpublisher генерит врапер над plsql-типами, неэффективный. Используй отдельные поля или sql-типы.
18 мар 14, 17:38    [15747724]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить