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

Откуда:
Сообщений: 359
Помогите составить sql запрос, так чтобы в таблицу попадали только те строки, значеия некоторого поля у которых неравно его значению по умолчанию. Проблема в том, что я не знаю как получить это значение по умолчанию в sql запросе.
на мой взгляд запрос должен выглядеть примерно так:
SELECT time, value FROM table WHERE value <> 'значение по умолчанию'
16 мар 08, 13:23    [5415415]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6919
palich12
Помогите составить sql запрос, так чтобы в таблицу попадали только те строки, значеия некоторого поля у которых неравно его значению по умолчанию.

из системных вьюх можно, вот только польза сомнительная от этого... Зачем оно вам?
16 мар 08, 14:33    [5415492]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
juks@gala.net
Member

Откуда: Киев
Сообщений: 4212
SQL> desc user_tab_columns
 Name                                  Null? Type
 ----------------------------------------- -------- ----------------------------
 .......
 DATA_DEFAULT                          LONG
 ....... 
16 мар 08, 14:42    [5415508]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
palich12
Помогите составить sql запрос, так чтобы в таблицу попадали только те строки, значеия некоторого поля у которых неравно его значению по умолчанию. Проблема в том, что я не знаю как получить это значение по умолчанию в sql запросе.
на мой взгляд запрос должен выглядеть примерно так:
SELECT time, value FROM table WHERE value <> 'значение по умолчанию'

Для случая, когда поле имеет тип NUMBER(n) в Oracle 10 это может выглядеть так:

create table TEST (test_id number(9), value number(9) default 0);
insert into TEST (test_id) select rownum from DUAL connect by level <= 10;
update TEST set value = 1 where mod(test_id, 2) = 0;
commit;
SQL> select *
  2  from TEST
  3  where value != (
  4          select XmlType(
  5                   dbms_metadata.get_xml('TABLE', 'TEST', user)
  6                 ).extract(
  7                   '/ROWSET/ROW/TABLE_T/COL_LIST/COL_LIST_ITEM[NAME="VALUE"]/DEFAULT_VAL/text()'
  8                 ).getNumBerVal()
  9          from DUAL
 10        );

   TEST_ID      VALUE
---------- ----------
         2          1
         4          1
         6          1
         8          1
        10          1
16 мар 08, 15:40    [5415573]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10054
Denis Popov

Для случая, когда поле имеет тип NUMBER(n) в Oracle 10 это может выглядеть так:


Well, in general, it is not possible to составить sql запрос, так чтобы в таблицу попадали только те строки, значеия некоторого поля у которых неравно его значению по умолчанию. For example, it is not possible if functions SYSDATE, SYSTIMESTAMP, UID or USER are used in DEFAULT value. Now for cases where it is possible, such запрос, in general, must be dynamic SQL since DATA_DEFAULT stores not default value itself but rather the expression used to calculate default value:

SQL> create table TEST (test_id number(9), value number(9) default 2 + 2);

Table created.

SQL> insert into TEST (test_id) select rownum from DUAL connect by level <= 10;

10 rows created.

SQL> select *
  2  from TEST
  3  where value != (
  4          select XmlType(
  5                   dbms_metadata.get_xml('TABLE', 'TEST', user)
  6                 ).extract(
  7                   '/ROWSET/ROW/TABLE_T/COL_LIST/COL_LIST_ITEM[NAME="VALUE"]/DEFAULT_VAL/text()'
  8                 ).getNumBerVal()
  9          from DUAL
 10        );
               ).getNumBerVal()
                             *
ERROR at line 8:
ORA-01722: invalid number
ORA-06512: at "SYS.XMLTYPE", line 168


SQL> select column_name,data_default from user_tab_columns where table_name = 'TEST';

COLUMN_NAME                    DATA_DEFAULT
------------------------------ ------------------------------
TEST_ID
VALUE                          2 + 2

SQL>  

SY.
16 мар 08, 16:28    [5415641]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
palich12
Member

Откуда:
Сообщений: 359
У меня поле value имеет тип FLOAT и стоит oracle 8i . И мне не хотелось бы жёстко привязываться к версии. Вдруг изменится что, может есть более изящный способ решить эту проблему??
16 мар 08, 17:06    [5415689]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862

palich12 wrote:

> У меня поле value имеет тип FLOAT и стоит oracle 8i . И мне не хотелось
> бы жёстко привязываться к версии. Вдруг изменится что, может есть более
> изящный способ решить эту проблему??

По-моему в 8i еще не было пакета DBMS_METADATA. Напиши свою функцию, которая будет возвращать
значение по умолчанию для поля таблицы. Оно видно в поле USER_TAB_COLUMNS.DATA_DEFAULT, надо будет
поработать с типом LONG.

Posted via ActualForum NNTP Server 1.4

16 мар 08, 17:27    [5415727]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10054
palich12
У меня поле value имеет тип FLOAT и стоит oracle 8i . И мне не хотелось бы жёстко привязываться к версии. Вдруг изменится что, может есть более изящный способ решить эту проблему??


Generic solution:

SQL> create table tbl(x number,y float default '1' + '1');

Table created.

SQL> select column_name,data_default from user_tab_columns where table_name = 'TBL';

COLUMN_NAME                    DATA_DEFAULT
------------------------------ ------------------------------
X
Y                              '1' + '1'

SQL> insert into tbl(x) select 1 from dual;

1 row created.

SQL> insert into tbl values(2,5);

1 row created.

SQL> CREATE OR REPLACE
  2    FUNCTION GET_FLOAT_DEFAULT(
  3                               p_table_name  VARCHAR2,
  4                               p_column_name VARCHAR2
  5                              )
  6      RETURN FLOAT
  7      IS
  8          v_default VARCHAR2(1000);
  9          v_float   FLOAT;
 10      BEGIN
 11          SELECT  data_default
 12            INTO  v_default
 13            FROM  USER_TAB_COLUMNS
 14            WHERE TABLE_NAME  = p_table_name
 15              AND COLUMN_NAME = p_column_name;
 16          EXECUTE IMMEDIATE 'SELECT ' || v_default || ' FROM DUAL' INTO v_float;
 17          RETURN v_float;
 18  END;
 19  /

Function created.

SQL> select  *
  2    from  tbl
  3    where y <> get_float_default('TBL','Y')
  4  /

         X          Y
---------- ----------
         2          5

SQL> select  *
  2    from  tbl
  3    where y = get_float_default('TBL','Y')
  4  /

         X          Y
---------- ----------
         1          2

SQL> 

If default values are literals:

SQL> create table tbl(x number,y float default 1.2e-3);

Table created.

SQL> insert into tbl(x) select 1 from dual;

1 row created.

SQL> insert into tbl values(2,5);

1 row created.

SQL> CREATE OR REPLACE
  2    FUNCTION GET_FLOAT_DEFAULT(
  3                               p_table_name  VARCHAR2,
  4                               p_column_name VARCHAR2
  5                              )
  6      RETURN FLOAT
  7      IS
  8          v_float   FLOAT;
  9      BEGIN
 10          SELECT  data_default
 11            INTO  v_float
 12            FROM  USER_TAB_COLUMNS
 13            WHERE TABLE_NAME  = p_table_name
 14              AND COLUMN_NAME = p_column_name;
 15          RETURN v_float;
 16  END;
 17  /

Function created.

SQL> select  *
  2    from  tbl
  3    where y <> get_float_default('TBL','Y')
  4  /

         X          Y
---------- ----------
         2          5

SQL> select  *
  2    from  tbl
  3    where y = get_float_default('TBL','Y')
  4  /

         X          Y
---------- ----------
         1      .0012

SQL> 

SY.

Сообщение было отредактировано: 16 мар 08, 18:02
16 мар 08, 18:00    [5415784]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6919
Все же хотелось бы узнать исконные причины сего извращения :)
16 мар 08, 19:03    [5415872]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
palich12
Member

Откуда:
Сообщений: 359
SY

Спасибо конечно за большой подробный ответ, но моя программа будет работать на многих серверах с одинаковой моделью данных, создавать на каждом такую процедуру нет возможности (я не админ) да и огород такой разводить совсем никак нельзя. Можно ли как-то это всё в запрос посадить или еще один запрос создать для получения этого значения?? И ещё я не понял, что такое '1'+'1' у меня поле типа FLOAT. PL/SQL выдаёт что там значение по умолчанию -32768, я так понимаю оно меняться может, а чтоб кучу настроек в программе не воротить лучше его из базы вытащить.
16 мар 08, 19:49    [5416003]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10054
palich12
SY

Спасибо конечно за большой подробный ответ, но моя программа будет работать на многих серверах с одинаковой моделью данных, создавать на каждом такую процедуру нет возможности (я не админ) да и огород такой разводить совсем никак нельзя. Можно ли как-то это всё в запрос посадить или еще один запрос создать для получения этого значения?? И ещё я не понял, что такое '1'+'1' у меня поле типа FLOAT. PL/SQL выдаёт что там значение по умолчанию -32768, я так понимаю оно меняться может, а чтоб кучу настроек в программе не воротить лучше его из базы вытащить.


You can not avoid огород такой разводить for one simple reason - column DATA_DEFAULT has datatype LONG. And if you RTFM LONG you will understand "огород" and why Denis Popov said "надо будет поработать с типом LONG". In regards to "И ещё я не понял, что такое '1'+'1'". This was just an illustration that DATA_DEFAULT literally stores what was typed. If you define float column with DEFAULT 1 + 1, DATA_DEFAULT will not store 2. It will store 1 + 1. If you put (2) as default, again, DATA_DEFAULT will not store 2. It will store (2).So for generic solution we are forced to use dynamic sql. In your case, default value is a numeric literal, therefore you can avoid dynamic sql. What you can do to avoid user defined function alltogether? If your program will be called from SQL*Plus, you could:

SQL> VARIABLE DEFAULT_VALUE NUMBER
SQL> BEGIN
  2  SELECT  DATA_DEFAULT
  3    INTO  :DEFAULT_VALUE
  4    FROM  USER_TAB_COLUMNS
  5    WHERE TABLE_NAME = 'TBL'
  6      AND COLUMN_NAME = 'Y';
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL> SELECT  *
  2    FROM  TBL
  3    WHERE Y = :DEFAULT_VALUE
  4  /

         X          Y
---------- ----------
         1      .0012

SQL> SELECT  *
  2    FROM  TBL
  3    WHERE Y <> :DEFAULT_VALUE
  4  /

         X          Y
---------- ----------
         2          5

SQL> 

SY.
16 мар 08, 20:47    [5416103]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
ыыы
Guest
автор

You can not avoid огород такой разводить for one simple reason ...


SY жжот
17 мар 08, 12:20    [5417804]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
а не подумать ли автору про уник. констрейнт(ы) / u-fbi ?
17 мар 08, 12:35    [5417974]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
vvetrov
Member

Откуда:
Сообщений: 45
select data_default into from user_tab_columns
where table_name = upper(:TABLENAME)
and column_name = UPPER(:COLUMNNAME);
17 мар 08, 14:11    [5418760]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
palich12
Member

Откуда:
Сообщений: 359
vvetrov
select data_default into from user_tab_columns
where table_name = upper(:TABLENAME)
and column_name = UPPER(:COLUMNNAME);

Спасибо, Вам wetrov. Всё отлично работает. Не то что некоторые
SY
You can not avoid огород такой разводить for one simple reason - column DATA_DEFAULT has datatype LONG.
14 апр 08, 13:47    [5542437]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10054
palich12
vvetrov
select data_default into from user_tab_columns
where table_name = upper(:TABLENAME)
and column_name = UPPER(:COLUMNNAME);

Спасибо, Вам wetrov. Всё отлично работает. Не то что некоторые
SY
You can not avoid огород такой разводить for one simple reason - column DATA_DEFAULT has datatype LONG.


Well, learn how to ask a quetion:
palich12
Помогите составить sql запрос, так чтобы в таблицу попадали только те строки, значеия некоторого поля у которых неравно его значению по умолчанию
. Using vvetrovs statement which is (no offense) same SQL as in my function with function parameters changed into bind variables. Now you have to create bind variables, assign them values, run vvetrov's SQL and only then issue select to get "только те строки, значеия некоторого поля у которых неравно его значению по умолчанию" or you could create a SQL*Plus script for that. In both cases it is not a "sql запрос".

SY.
14 апр 08, 17:08    [5544151]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
SY
..

SY.

во, во + еще, мало извлечь data_default из словаря
надо не забыть еще сделать из него именно значение.
Опять же от типов данных - кое что зависит.
ить:
SQL> create table t_mumu(d date          default trunc(sysdate)
  2                     ,s1 varchar2(30) default 'sysdate'
  3                     ,s2 varchar2(30) default q'<sysdate>'
  4                     ,n1 number       default ' 1'
  5                     ,n2 number(10,2) default 0.001);

Таблица создана.

SQL> insert into t_mumu(d) values(default);

1 строка создана.

SQL> select * from t_mumu;

D        S1                             S2                                     N1         N2
-------- ------------------------------ ------------------------------ ---------- ----------
14.04.08 sysdate                        sysdate                                 1          0
14 апр 08, 17:31    [5544350]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
palich12
vvetrov
select data_default into from user_tab_columns
where table_name = upper(:TABLENAME)
and column_name = UPPER(:COLUMNNAME);

Спасибо, Вам wetrov. Всё отлично работает. Не то что некоторые
SY
You can not avoid огород такой разводить for one simple reason - column DATA_DEFAULT has datatype LONG.


*потирает руки* Жду, когда Вы наткнётесь на DATA_DEFAULT = 'SYSDATE'...

PS: А ведь SY предупреждал, долго так, обстоятельно...
14 апр 08, 17:37    [5544403]     Ответить | Цитировать Сообщить модератору
 Re: Как получить значение поля по умолчанию?  [new]
palich12
Member

Откуда:
Сообщений: 359
Да это я сам виноват. Не правильно сформулировал. Прошу прощения )). Я в полне хорошо обошёлся двумя запросами. В первом получал значение, а во втором использовал его в where.
15 апр 08, 10:38    [5546288]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить