powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вычисляемое поле в таблице
14 сообщений из 14, страница 1 из 1
вычисляемое поле в таблице
    #39385517
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

Хм...
Т.к. работает команда, то получилось следующее:
В схеме создали функцию:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE FUNCTION ZAGS_NSI.F_FLAG_ACTUAL (DATE_BEGIN date, DATE_END date) RETURN NUMBER DETERMINISTIC  AS 
BEGIN
declare rnum number;
begin
if
DATE_BEGIN<=trunc(sysdate) and DATE_END>trunc(sysdate)
then rnum:=1;
else rnum:=0;
end if; 
  RETURN rnum;
end;
END F_FLAG_ACTUAL;
/


И в таблицу добавили поле:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE ZAGS_NSI.SP_ORGANIZATION_UNIQ
(
  ID               NUMBER(18)                   NOT NULL,
...........
  DATE_BEGIN       DATE,
  DATE_END         DATE                         DEFAULT to_date('31.12.2050','DD.MM.YYYY') NOT NULL,
...........
  FLAG_ACTUAL      NUMBER(1) Generated Always as ("ZAGS_NSI"."F_FLAG_ACTUAL"("DATE_BEGIN","DATE_END")) NOT NULL
)



FLAG_ACTUAL - вычисляемое поле в таблице... (ранее этого поля не было)
Все удовлетворяет, все вроде хорошо...
НО...
При переносе всех схем ДАМПОМ на другой сервер (т.к. поля не было, то все проходило на ура), выкатилась ошибка:
Starting "SYSTEM"."SYS_IMPORT_FULL_01": SYSTEM/********@ORCLTEST dumpfile=DATA_PUMP_DIR:ORCL_SCHEMAS.DMP logfile=DATA_PUMP_DIR:ORCL_SCHEMAS_log_impdp.log
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/DB_LINK
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
ORA-39083: Object type TABLE:"ZAGS_NSI"."SP_ORGANIZATION_UNIQ" failed to create with error:
ORA-00904: "ZAGS_NSI"."F_FLAG_ACTUAL": invalid identifier
Failing sql is:
CREATE TABLE "ZAGS_NSI"."SP_ORGANIZATION_UNIQ" ("ID" NUMBER(18,0) NOT NULL ENABLE, "ID_TYPE_ORG" NUMBER(18,0), "ID_PARENT" NUMBER(18,0), "KPP" VARCHAR2(9 CHAR), "OGRN" VARCHAR2(15 CHAR), "INN" VARCHAR2(12 CHAR), "OKPO" VARCHAR2(10 CHAR), "ID_LOCATION" NUMBER(18,0), "FLAG_DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE, "FLAG_INDIVIDUAL" NUMBER(1...

И пошли ошибки....
Увидел, что из-за вычислимого поля...
Т.к. таблицы создаются ранее, а потом все остальное...
А в описании таблицы присутствует ссылка на функцию...

Попробовал тестовую таблицу создать:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE SP_ORGANIZATION_UNIQ
(
  ID               NUMBER                   NOT NULL,
  DATE_BEGIN       DATE,
  DATE_END         DATE                         DEFAULT to_date('31.12.2050','DD.MM.YYYY') NOT NULL,
  FLAG_ACTUAL      NUMBER generated always as (CASE WHEN DATE_BEGIN<=trunc(sysdate) and DATE_END>trunc(sysdate) THEN 1 ELSE 0 END) NOT NULL
)

Error at line 1
ORA-54002: в выражении виртуального столбца можно задавать только чистые функции


Как обойти это ? к концу рабочего дня все кувырком...
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385531
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир САИ пошли ошибки....
Увидел, что из-за вычислимого поля...Это хорошо, что Oracle на взлёте наказал за недетерминизм.

Правильный путь - rename + create view.
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385627
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВладимир САИ пошли ошибки....
Увидел, что из-за вычислимого поля...Это хорошо, что Oracle на взлёте наказал за недетерминизм.

Правильный путь - rename + create view.Расшифруй "недетерминизм"... плиз...

Да я понимаю, что View надо...
Но разрабы интерфейса на C#, них EF + макет...
Не пойдут на это скорее всего... Но это завтра с ними говорить буду...

Пока ехал домой подумал...
Сделать поле не вычисляемым (стандартным)...
И на триггеры INSERT, UPDATE навесить изменение поля, можно и функцию использовать...
Но это завтра...
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385635
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир САПри переносе всех схем ДАМПОМ на другой сервер (т.к. поля не было, то все проходило на ура), выкатилась ошибка:

ORA-00904: "ZAGS_NSI"."F_FLAG_ACTUAL": invalid identifier




Функцию-то перенес? Но суть не в этом. Ты хоть понимаешь что SYSDATE в SQL предложении вычисляется один раз а не для каждой строки в момент её выборки в то врeмя как PL/SQL вычисляет SYSDATE при каждом обращении. Посему если ты запустишь что-то типа:

Код: plsql
1.
2.
3.
4.
SELECT  *
  FROM  ZAGS_NSI.SP_ORGANIZATION_UNIQ
  WHERE FLAG_ACTUAL = 1
/



сегодня дo полуночи а закончится он после полуночи (т.е. завтра) то строки с BEGIN_DATE и/или END_DATE = сегодня получат FLAG_ACTUAL = 1 если WHERE (и соответственно вычисление FLAG_ACTUAL) произойдет до полуночи и они будут выбраны а строки с BEGIN_DATE и/или END_DATE = сегодня получат FLAG_ACTUAL = 0 если WHERE (и соответственно вычисление FLAG_ACTUAL) произойдет после полуночи и они нe будут выбраны.

SY.
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385638
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир САРасшифруй "недетерминизм"sysdate сегодня один, завтра другой.
Владимир САСделать поле не вычисляемым (стандартным)...
И на триггеры INSERT, UPDATE навесить изменение поля,Не доходит до тебя недетерминизм текущей даты.
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385657
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic sysdate сегодня один, завтра другой.
Это им и надо... как я понял...
Тогда мой подход по триггерам неподходит...
Только View... спасет отца русской демократии...
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385662
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир САТолько View... спасет отца русской демократии...


Или переход на 12C и temporal validity.

SY.
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385663
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYtemporal validity.Этот синтаксический сахар ничего принципиально не меняет.
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385677
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicЭтот синтаксический сахар ничего принципиально не меняет.

Упрощает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE ZAGS_NSI.SP_ORGANIZATION_UNIQ
(
  ID               NUMBER(18)                   NOT NULL,
...........
  DATE_BEGIN       DATE,
  DATE_END         DATE                         DEFAULT to_date('31.12.2050','DD.MM.YYYY') NOT NULL,
...........
PERIOD FOR VALID_DATE (DATE_BEGIN,DATE_END)
)
/
SELECT  *
  FROM  ZAGS_NSI.SP_ORGANIZATION_UNIQ
  AS OF PERIOD FOR VALID_DATE TRUNC(SYSDATE)
/



SY.
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385810
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то неумело oracle в 11g сделал вычисляемые поля в таблице.
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385814
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYУпрощает:Мне можно не показывать. Но где не сахар?
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385815
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир САКак-то неумело oracle в 11g сделал вычисляемые поля в таблице.Не тебе, чудак, судить.
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385816
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВладимир САКак-то неумело oracle в 11g сделал вычисляемые поля в таблице.Не тебе, чудак, судить.Я вообще то тебя не унижал...
Но оракл вообще то делает для пользователей продукт.
И должен отслеживать свои фичи.
...
Рейтинг: 0 / 0
вычисляемое поле в таблице
    #39385818
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир САНо оракл вообще то делает для пользователей продукт.
И должен отслеживать свои фичи.Ай, недосмотрели! Какого-то наивного Вову забыли спросить. За всеми бегали, а вот за ним недобежали.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вычисляемое поле в таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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