Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Ошибка rowid при объединений таблиц  [new]
gepka
Member

Откуда:
Сообщений: 1
Здравствуйте Уважаемые форумачене! Имеется такие таблица T_PERSON с такими данными:
Name                           NULL     TYPE                                                                                                                                                                                          
------------------------------ -------- -----------------------
CODE                           NOT NULL NUMBER(30)                                                                                                                                                                                    
LASTNAME                    NOT NULL VARCHAR2(100)                                                                                                                                                                                 
FIRST_NAME                 NOT NULL VARCHAR2(100)                                                                                                                                                                                 
SECONDNAME                               VARCHAR2(100)                                                                                                                                                                                 
BIRTHDAY                    NOT NULL DATE

При таком запросе все корректно отрабатывается:
SELECT DISTINCT code, lastname, first_name, secondname, birthday FROM T_PERSON
WHERE code>0 AND (UPPER(first_name)= UPPER('Jennifer')) UNION SELECT 1, BANNER, 'first_name', 'secondname', 
sysdate FROM V$VERSION;

Но, если ввести такой запрос ругается на ошибку ROWID:
01445. 00000 - "cannot select ROWID from, or sample, a join view without a key-preserved table"
SELECT DISTINCT rowid, code, lastname, first_name, secondname, birthday FROM T_PERSON
WHERE code>0 AND (UPPER(first_name)= UPPER('Jennifer')) UNION SELECT rowid, 1, BANNER, 'first_name', 'secondname', 
sysdate FROM V$VERSION;

Можете объяснить как можно решить эту проблему, не убирая ROWID с запроса?
27 янв 19, 20:14    [21795326]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
-2-
Member

Откуда:
Сообщений: 15330
gepka
не убирая ROWID с запроса?
заключи rowid в одинарный кавычки.
27 янв 19, 21:26    [21795363]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Elic
Member

Откуда:
Сообщений: 29990
gepka
Можете объяснить как можно решить эту проблему, не убирая ROWID с запроса?
Ты хочешь выстрелить себе в ногу и при этом ещё и зовёшь нас в соучастники?!

RTFM
27 янв 19, 21:41    [21795369]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
А тебя не смущает что V$VERSION это view и посему ROWID не имеет и не может иметь по определению? Все что view может это показать ROWID key-preserved таблицы (ежели такая во view имеется). И Oracle тебе прямо намекает: "cannot select ROWID from, or sample, a join view without a key-preserved table"

SY.

Сообщение было отредактировано: 27 янв 19, 23:11
27 янв 19, 23:02    [21795393]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
gepka,

rowid даст уникальность
DISTINCT лишний

оптимизатор может и справится, но я б убрал с селекта

.....
stax
28 янв 19, 09:50    [21795510]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
-2-
Member

Откуда:
Сообщений: 15330
Stax
даст уникальность
огласите весь список!
28 янв 19, 10:11    [21795529]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
-2-
Stax
даст уникальность
огласите весь список!

не понял про список

rowid даст уникальность строки (rowid, code, lastname, first_name, secondname, birthday) в выборке

....
stax
28 янв 19, 10:17    [21795535]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Elic
Member

Откуда:
Сообщений: 29990
Stax
rowid даст уникальность строки
SQL> select rowid from dual connect by level <= 3;

ROWID
------------------
AAAAECAABAAAAgiAAA
AAAAECAABAAAAgiAAA
AAAAECAABAAAAgiAAA
28 янв 19, 10:19    [21795538]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
Elic,

автор
Имеется такие таблица T_PERSON с такими данными:


....
stax
28 янв 19, 10:22    [21795543]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Elic
Member

Откуда:
Сообщений: 29990
Станислав, твоя проблема в том, что ты всегда с готовностью лезешь подбирать оружие и боеприпасы для выстрела в ногу.
28 янв 19, 10:31    [21795547]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
Elic
Станислав, твоя проблема в том, что ты всегда с готовностью лезешь подбирать оружие и боеприпасы для выстрела в ногу.

причем в етом случае нога?
наоборот, в в етот раз я внимательно прочитал вопрос в части что T_PERSON таблица

ps
в запросе UNION, что тоже даст ненужний общий DISTINCT

pss

21795363 не на всех версиях отработает
.....
stax
28 янв 19, 10:51    [21795566]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Elic
Member

Откуда:
Сообщений: 29990
Stax
причем в етом случае нога?
Зачем ТС-у rowid?
28 янв 19, 11:04    [21795573]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
Elic
Stax
причем в етом случае нога?
Зачем ТС-у rowid?


откуда мне знать

ps
FROM V$VERSION тоже странно, скорее всего ето просто схема(структура) запроса,
а не реальный запрс


зии
раз уж зашел разговор о rowid
DBMS_ROWID.ROWID_CREATE как бы должна возвращать ровид, а чет у меня не выходит


автор
ROWID_CREATE Function
This function lets you create a ROWID, given the component parts as parameters.

This is useful for testing ROWID operations, because only the Oracle Server can create a valid ROWID that points to data in a database.

Syntax

DBMS_ROWID.ROWID_CREATE (
rowid_type IN NUMBER,
object_number IN NUMBER,
relative_fno IN NUMBER,
block_number IN NUMBER,
row_number IN NUMBER)


RETURN ROWID;


  1  SELECT dump(DBMS_ROWID.ROWID_CREATE(0, 9999, 12, 1000, 13))  FROM dual
  2  union all
  3* SELECT dump(DBMS_ROWID.ROWID_CREATE(1, 9999, 12, 1000, 13))  FROM dual
sql> /

DUMP(DBMS_ROWID.ROWID_CREATE(0,9999,12,1000,13))
---------------------------------------------------------------------------------------------------------------
Typ=1 Len=18: 48,48,48,48,48,51,69,56,46,48,48,48,68,46,48,48,48,67
Typ=1 Len=18: 65,65,65,67,99,80,65,65,77,65,65,65,65,80,111,65,65,78


Typ=1 ето как-бы varchar2
.....
stax
28 янв 19, 11:32    [21795611]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
-2-
Member

Откуда:
Сообщений: 15330
Stax
Typ=1 ето как-бы varchar2
У dump три оверлоада и среди них нет rowid
28 янв 19, 11:36    [21795613]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
-2-
Stax
Typ=1 ето как-бы varchar2
У dump три оверлоада и среди них нет rowid

почему тогда?
SQL> SELECT rowid,dummy  FROM dual
  2  union all
  3  SELECT DBMS_ROWID.ROWID_CREATE(1, 9999, 12, 1000, 13),'y'  FROM dual
  4  /
SELECT rowid,dummy  FROM dual
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression


SQL> ed
Wrote file afiedt.buf

  1  SELECT rowid,dummy  FROM dual
  2  union all
  3* SELECT DBMS_ROWID.ROWID_CREATE(0, 9999, 12, 1000, 13),'y'  FROM dual
SQL> /
SELECT rowid,dummy  FROM dual
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression



SQL> ed
Wrote file afiedt.buf

  1  SELECT rowid,dump(rowid)  FROM dual
  2  union all
  3* SELECT chartorowid(DBMS_ROWID.ROWID_CREATE(1, 9999, 12, 1000, 13)),'y'  FROM dual
SQL> /

ROWID              DUMP(ROWID)
------------------ --------------------------------------------------------------------------------
AAAAB0AABAAAAOhAAA Typ=69 Len=10: 0,0,0,116,0,64,3,161,0,0
AAACcPAAMAAAAPoAAN y


ps
Oracle Type Code Mappings
Data Type Uniform Type Code DUMP
ROWID 69 69

.....
stax
28 янв 19, 12:50    [21795695]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
-2-
Member

Откуда:
Сообщений: 15330
Stax
-2-
пропущено...
У dump три оверлоада и среди них нет rowid

почему тогда?
Значит я промахнулся. Смотреть нужно не в overloadы standard.dump, а в "оверлоады" plsqlного standard.rowid.
28 янв 19, 13:23    [21795747]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
-2-,

я не про dump, я о DBMS_ROWID.ROWID_CREATE
какой expression must have?
SQL> SELECT rowid,dummy  FROM dual
  2  union all
  3  SELECT DBMS_ROWID.ROWID_CREATE(0, 9999, 12, 1000, 13),'y'  FROM dual
  4  /
SELECT rowid,dummy  FROM dual
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression


SQL> ed
Wrote file afiedt.buf

  1  SELECT rowid,dummy  FROM dual
  2  union all
  3* SELECT DBMS_ROWID.ROWID_CREATE(1, 9999, 12, 1000, 13),'y'  FROM dual
SQL> /
SELECT rowid,dummy  FROM dual
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression


.....
stax
28 янв 19, 13:36    [21795770]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Elic
Member

Откуда:
Сообщений: 29990
Stax
какой expression must have?
Ту уже
-2-
Смотреть … в "оверлоады" plsqlного standard.rowid
?
28 янв 19, 13:39    [21795778]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
Elic
Stax
какой expression must have?
Ту уже
-2-
Смотреть … в "оверлоады" plsqlного standard.rowid
?


завязываем, мне ето не понять

SQL> ed
Wrote file afiedt.buf

  1  declare
  2   w1 rowid;
  3   w2 rowid;
  4  begin
  5   w1:=DBMS_ROWID.ROWID_CREATE(1, 9999, 12, 1000, 13);
  6   select DBMS_ROWID.ROWID_CREATE(1, 9999, 12, 1000, 13) into w2 from dual;
  7   dbms_output.put_line(w1);
  8   dbms_output.put_line(w2);
  9   for r in (
 10     select rowid from dual
 11     union all
 12     select DBMS_ROWID.ROWID_CREATE(1, 9999, 12, 1000, 13) from dual) loop
 13    null;
 14   end loop;
 15* end;
SQL> /
AAACcPAAMAAAAPoAAN
AAACcPAAMAAAAPoAAN
declare
*
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression
ORA-06512: at line 9


....
stax
28 янв 19, 14:00    [21795838]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Elic
Member

Откуда:
Сообщений: 29990
Stax
мне ето не понять
select * from all_source where name = 'STANDARD' and lower(text) like '%rowid% is%';
28 янв 19, 15:03    [21795924]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
Elic
Stax
мне ето не понять
select * from all_source where name = 'STANDARD' and lower(text) like '%rowid% is%';

я ето знаю, не понимаю как им пользоваться
напр
    pragma interface (c,peslik4);
  subtype ROWID is VARCHAR2(256);


почему union all слетает, а напр into нет

повторюсь
для меня ето непринципиально, так для общего развития

....
stax
28 янв 19, 15:47    [21795961]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Elic
Member

Откуда:
Сообщений: 29990
Stax
почему union all слетает,
RTFM
The corresponding expressions in the select lists of the component queries of a compound query must match in number and must be in the same data type group (such as numeric or character).
28 янв 19, 16:01    [21795983]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18371
Stax
не понимаю как им пользоваться

with t as (select DBMS_ROWID.ROWID_CREATE(1, 142, 1, 573, 0) r_str from dual)
select cast(r_str as rowid) rid, r_str from t
union all select rowid, rowidtochar(rowid) from dual;
RID                R_STR
------------------ ------------------
AAAACOAABAAAAI9AAA AAAACOAABAAAAI9AAA
AAAACOAABAAAAI9AAA AAAACOAABAAAAI9AAA

SQL> 
28 янв 19, 16:25    [21796016]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
andrey_anonymous
Stax
не понимаю как им пользоваться

with t as (select DBMS_ROWID.ROWID_CREATE(1, 142, 1, 573, 0) r_str from dual)
select cast(r_str as rowid) rid, r_str from t
union all select rowid, rowidtochar(rowid) from dual;
RID                R_STR
------------------ ------------------
AAAACOAABAAAAI9AAA AAAACOAABAAAAI9AAA
AAAACOAABAAAAI9AAA AAAACOAABAAAAI9AAA

SQL> 


с етим понятно (cast или chartorowid)

21795611
почему DBMS_ROWID.ROWID_CREATE(1, 142, 1, 573, 0) str (varchar2)?

.....
stax
28 янв 19, 16:47    [21796047]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка rowid при объединений таблиц  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
Elic
Stax
почему union all слетает,
RTFM
The corresponding expressions in the select lists of the component queries of a compound query must match in number and must be in the same data type group (such as numeric or character).


SQL> select rowid r1 from dual
  2  union all
  3  select DBMS_ROWID.ROWID_CREATE(1, 9999, 12, 1000, 13) r2 from dual
  4  /
select rowid from dual
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

r1 тип rowid
r2 тип должен быть rowid (the same data type)

FUNCTION ROWID_CREATE RETURNS ROWID
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ROWID_TYPE                     NUMBER                  IN
 OBJECT_NUMBER                  NUMBER                  IN
 RELATIVE_FNO                   NUMBER                  IN
 BLOCK_NUMBER                   NUMBER                  IN
 ROW_NUMBER                     NUMBER                  IN


....
stax
28 янв 19, 16:52    [21796057]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить