Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с синтаксисом / 21 сообщений из 21, страница 1 из 1
17.08.2017, 15:28
    #39506944
Ilnov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Добрый день.
Просьба помочь с синтаксисом.
Необходимо в select указать динамическую таблицу, название которой будет генериться другим select.
К примеру:
select * from qaz
где qaz это результат запроса select name from table1 where id = 1.
В интернете много примеров, но ни один из них не выдал необходимого результата.
Спасибо.
...
Рейтинг: 0 / 0
17.08.2017, 15:39
    #39506954
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Ilnov,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> ed
Wrote file afiedt.buf

  1  declare
  2   v_tname varchar2(30);
  3   cr sys_refcursor;
  4   v_temp varchar2(20);
  5  begin
  6   select 'dept' n into v_tname from dual;
  7   open cr for 'select dname from '||v_tname;
  8   loop
  9      fetch cr into v_temp;
 10      if cr%notfound then exit; end if;
 11      dbms_output.put_line(v_temp);
 12   end loop;
 13* end;
SQL> /
ACCOUNTING
RESEARCH
SALES
OPERATIONS

PL/SQL procedure successfully completed.



.....
stax
...
Рейтинг: 0 / 0
17.08.2017, 16:40
    #39507008
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Stax, забыл курсор закрыть (и заказчик хотел все столбцы)

IlnovДобрый день.
Просьба помочь с синтаксисом.
Необходимо в select указать динамическую таблицу, название которой будет генериться другим select.
К примеру:
select * from qaz
где qaz это результат запроса select name from table1 where id = 1.
В интернете много примеров, но ни один из них не выдал необходимого результата.
Спасибо.Здорово.
Вот тебе пример с необходимым (даже если захочешь, не обойдёшь) результатом:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare
  tab          varchar2(4000); -- := 'qaz';
  owner        varchar2(32) default user;
  v_sql        varchar(4000);
  list_tab_col varchar2(4000);
begin
select name into tab from table1 where id = 1;
  select listagg(tab || '.' || dtc.COLUMN_NAME, ';') within group(order by dtc.COLUMN_ID)
    into list_tab_col
    from all_tab_columns dtc
   where dtc.TABLE_NAME = upper(tab)
     and dtc.DATA_TYPE not like '_LOB'
     and dtc.OWNER = upper(owner);
  v_sql := 'begin for ' || tab || ' in (select * from ' || owner || '.' || tab ||
' where rownum < 11' --тут своё условие укажи или убери, если без условия (но поОООООооомни, что аутпут не бесконечен)
           || ') loop dbms_output.put_line(' ||
           replace(list_tab_col, ';', '||'';''||') || ');' || ' end loop;' ||
           ' end;';
  dbms_output.put_line(list_tab_col);
  execute immediate v_sql;
end;

Пожалуйста.

PS: можно из этого сделать потоковую функцию для вызова в sql, которая динамически будет создавать табличный тип по нужному набору колонок, заполнять его, возвращать данные и дропать его после вывода результатов. Но это уже сам, если осилишь...
...
Рейтинг: 0 / 0
17.08.2017, 16:53
    #39507018
Ilnov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
StaxIlnov,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> ed
Wrote file afiedt.buf

  1  declare
  2   v_tname varchar2(30);
  3   cr sys_refcursor;
  4   v_temp varchar2(20);
  5  begin
  6   select 'dept' n into v_tname from dual;
  7   open cr for 'select dname from '||v_tname;
  8   loop
  9      fetch cr into v_temp;
 10      if cr%notfound then exit; end if;
 11      dbms_output.put_line(v_temp);
 12   end loop;
 13* end;
SQL> /
ACCOUNTING
RESEARCH
SALES
OPERATIONS

PL/SQL procedure successfully completed.



.....
stax
Спасибо.
Пытался адаптировать к своему запросу:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
declare 
v_tname varchar2 (30); 
cr sys_refcursor; 
begin 
select a.TABLE_ID into v_tname from TEST.TABLE_LOAD a where a.LOAD_ID = 1; 
open cr for 'select * from ' || v_tname; 
dbms_output.put_line(v_tname); 
end;


Всё выполняется, только не выводит результат, чтобы понять, правильно выполняется или нет. Что делаю не так?
...
Рейтинг: 0 / 0
17.08.2017, 16:59
    #39507027
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Ilnov
Всё выполняется, только не выводит результат, чтобы понять, правильно выполняется или нет. Что делаю не так?

нет цыкла с fetch

Вы только открыли курсор, но данные из него не прочитали

зы
как указал Fogel курсор "желательно" закрывать
close cr;
.....
stax
...
Рейтинг: 0 / 0
18.08.2017, 08:52
    #39507278
Ilnov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
StaxIlnovВсё выполняется, только не выводит результат, чтобы понять, правильно выполняется или нет. Что делаю не так?

нет цыкла с fetch

Вы только открыли курсор, но данные из него не прочитали

зы
как указал Fogel курсор "желательно" закрывать
close cr;
.....
stax
Дописал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare 
    v_tname VARCHAR2 (16 Byte); 
    cr sys_refcursor; 
    v_temp NUMBER; 
begin 
    select a.TABLE_ID into v_tname from TEST.TABLE_LOAD a where a.LOAD_ID = 1; 
        open cr for 'select count (LOAD_ID) from ' || v_tname; 
            loop 
                fetch cr into v_temp; 
                if cr%notfound then exit; 
                end if; 
                dbms_output.put_line (v_temp);
            end loop;
        close cr; 
end;


Вывода всё равно нет. Внутренние запросы отрабатывают корректно.
...
Рейтинг: 0 / 0
18.08.2017, 09:07
    #39507286
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Ilnov,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  1  declare
  2      v_tname VARCHAR2 (16 Byte); --????
  3      cr sys_refcursor;
  4      v_temp NUMBER;
  5  begin
  6  --    select a.TABLE_ID into v_tname from TEST.TABLE_LOAD a where a.LOAD_ID = 1;
  7        select 'emp' into v_tname from dual;
  8          open cr for 'select count (comm) from ' || v_tname;
  9              loop
 10                  fetch cr into v_temp;
 11                  if cr%notfound then exit;
 12                  end if;
 13                  dbms_output.put_line (v_temp);
 14              end loop;
 15          close cr;
 16* end;
SQL> /
3

PL/SQL procedure successfully completed.

SQL>



если выполняете в sql*plus, то перед запуском скрипта
set serveroutput on

для count(*) (и не только) проще юзать execute immediate

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> ed
Wrote file afiedt.buf

  1  declare
  2      v_tname VARCHAR2 (16 Byte);  --почему 16 Byte?
  3      v_temp NUMBER;
  4      v_sql  varchar2(32000);
  5  begin
  6  --    select a.TABLE_ID into v_tname from TEST.TABLE_LOAD a where a.LOAD_ID = 1;
  7        select 'emp' into v_tname from dual;
  8        v_sql:= 'select count (comm) from ' || v_tname;
  9        execute immediate v_sql into v_temp;
 10        dbms_output.put_line (v_temp);
 11* end;
SQL> /
3

PL/SQL procedure successfully completed.

SQL>




ps
все конечно мое імхо
pss
count(*) "іммя таблицы" посчитать мона и по другому(без динамики), напр с помощью хмл%

.....
stax
...
Рейтинг: 0 / 0
18.08.2017, 09:38
    #39507299
Ilnov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
StaxIlnov,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  1  declare
  2      v_tname VARCHAR2 (16 Byte); --????
  3      cr sys_refcursor;
  4      v_temp NUMBER;
  5  begin
  6  --    select a.TABLE_ID into v_tname from TEST.TABLE_LOAD a where a.LOAD_ID = 1;
  7        select 'emp' into v_tname from dual;
  8          open cr for 'select count (comm) from ' || v_tname;
  9              loop
 10                  fetch cr into v_temp;
 11                  if cr%notfound then exit;
 12                  end if;
 13                  dbms_output.put_line (v_temp);
 14              end loop;
 15          close cr;
 16* end;
SQL> /
3

PL/SQL procedure successfully completed.

SQL>



если выполняете в sql*plus, то перед запуском скрипта
set serveroutput on

для count(*) (и не только) проще юзать execute immediate

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> ed
Wrote file afiedt.buf

  1  declare
  2      v_tname VARCHAR2 (16 Byte);  --почему 16 Byte?
  3      v_temp NUMBER;
  4      v_sql  varchar2(32000);
  5  begin
  6  --    select a.TABLE_ID into v_tname from TEST.TABLE_LOAD a where a.LOAD_ID = 1;
  7        select 'emp' into v_tname from dual;
  8        v_sql:= 'select count (comm) from ' || v_tname;
  9        execute immediate v_sql into v_temp;
 10        dbms_output.put_line (v_temp);
 11* end;
SQL> /
3

PL/SQL procedure successfully completed.

SQL>




ps
все конечно мое імхо
pss
count(*) "іммя таблицы" посчитать мона и по другому(без динамики), напр с помощью хмл%

.....
stax
Спасибо за Ваше терпение.
Запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
set serveroutput on
declare 
    v_tname VARCHAR2 (16 Byte); 
    cr sys_refcursor; 
    v_temp NUMBER; 
begin 
    select a.TABLE_ID into v_tname from TEST.TABLE_LOAD a where a.LOAD_ID = 3; 
        open cr for 'select count (LOAD_ID) from ' || v_tname; 
            loop 
                fetch cr into v_temp; 
                if cr%notfound then exit; 
                end if; 
                dbms_output.put_line (v_temp);
            end loop;
        close cr; 
end;


дал результаты.
Последний этап, запихнуть этот результат в таблицу.
...
Рейтинг: 0 / 0
18.08.2017, 10:01
    #39507314
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Ilnov,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare 
    v_tname VARCHAR2 (16 Byte);  -???
    cr sys_refcursor; 
    v_temp NUMBER; 
begin 
    select a.TABLE_ID into v_tname from TEST.TABLE_LOAD a where a.LOAD_ID = 3; 
    open cr for 'select count (LOAD_ID) from ' || v_tname; 
    fetch cr into v_temp; 
    dbms_output.put_line (v_temp);
    close cr; 
    update TEST.TABLE_LOAD set row_count=v_temp where LOAD_ID = 3;
  --insert test.into table_log(table_name,row_count) values (v_tname,v_temp);
  
end;


.....
stax
...
Рейтинг: 0 / 0
18.08.2017, 12:35
    #39507479
Ilnov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Финальный результат (может кому пригодится).
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE OR REPLACE TRIGGER trigger_test_z
after INSERT ON TABLE_LOAD_E
begin 
declare 
    v_tname VARCHAR2 (16);
    cr sys_refcursor; 
    v_temp NUMBER;
    v_num number; 
begin 
    select max (a.LOAD_ID) into v_num 
        from TEST.TABLE_LOAD_E a; 
    select b.TABLE_ID into v_tname 
        from TEST.TABLE_LOAD_E b 
            where b.LOAD_ID = v_num;
    open cr for 'select count (LOAD_ID) 
                    from ' || v_tname || ' 
                        where LOAD_ID = '|| v_num; 
    fetch cr into v_temp; 
    dbms_output.put_line (v_temp);
    close cr;
    update TEST.TABLE_LOAD_E c set c.SUM_COL = v_temp where c.LOAD_ID = v_num;
end;
end;
/


Всем спасибо большое за помощь!
...
Рейтинг: 0 / 0
18.08.2017, 12:57
    #39507495
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Ilnov,

че ж Вы сразу не сказали что нужен триггер

надо чуточку не так

.....
stax
...
Рейтинг: 0 / 0
18.08.2017, 15:23
    #39507587
Ilnov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
StaxIlnov,

че ж Вы сразу не сказали что нужен триггер

надо чуточку не так

.....
stax
Если не сложно поделиться опытом, то как (для понимания)?
...
Рейтинг: 0 / 0
18.08.2017, 16:03
    #39507622
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
IlnovStaxIlnov,

че ж Вы сразу не сказали что нужен триггер

надо чуточку не так

.....
stax
Если не сложно поделиться опытом, то как (для понимания)?

на счет опыта дело наживное, я тож учусь (возможно немножко дольше Вас)

как пример триггера
Код: 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.
SQL> desc TABLE_LOAD_E;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABLE_ID                                           VARCHAR2(30)
 SUM_COL                                            NUMBER(38)
 DATE_COUNT                                         DATE

SQL> select * from TABLE_LOAD_E;

no rows selected

SQL> CREATE OR REPLACE TRIGGER trigger_test_z
  2  before INSERT ON TABLE_LOAD_E
  3  for each row
  4  begin
  5    --вичисляем к-во закоммиченных строк в таблице на ПРИМЕРНО момент вставки
  6    :new.date_count:=sysdate;
  7    execute immediate 'select count(*) from '||:new.table_id into :new.sum_col;
  8  exception when others then
  9    :new.sum_col:=SQLCODE;
 10  end;
 11  /

Trigger created.

SQL> insert into TABLE_LOAD_E(table_id) (
  2   select 'EMP' from dual union all
  3   select 'DEPT' from dual union all
  4   select 'Ой!' from dual )
  5  /

3 rows created.

SQL> select * from TABLE_LOAD_E;

TABLE_ID                          SUM_COL DATE_COU
------------------------------ ---------- --------
EMP                                    14 18.08.17
DEPT                                    4 18.08.17
Ой!                                  -933 18.08.17

SQL>

SQL> select count(*) from emp;

  COUNT(*)
----------
        14

SQL> select count(*) from dept;

  COUNT(*)
----------
         4

SQL> select count(*) from Ой!;
select count(*) from Ой!
                       *
ERROR at line 1:
ORA-00933: SQL command not properly ended

SQL> commit;

Commit complete.




ps
по Вашему триггеру, инсерт может добавлять за раз больше одной записи
и тд

.....
stax
...
Рейтинг: 0 / 0
22.08.2017, 16:26
    #39508849
Ilnov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Не могу понять причину ошибки.
Триггер:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE OR REPLACE TRIGGER trigger_test_y
after INSERT ON TABLE_LOAD_A
begin 
declare 
    v_tname VARCHAR2 (16);
    cr sys_refcursor; 
    v_temp NUMBER;
    v_num number; 
begin 
    select max (a.LOAD_ID) into v_num 
        from TEST.TABLE_LOAD_B a; 
    select '''' || b.TABLE_ID || '''' into v_tname 
        from TEST.TABLE_LOAD_B b 
            where b.LOAD_ID = v_num;
    open cr for 'select sum (BYTES) 
                    from dba_segments 
                        where SEGMENT_NAME = ' || v_tname; 
    fetch cr into v_temp; 
    dbms_output.put_line (v_temp);
    close cr;
    update TEST.TABLE_LOAD_B c set c.BYTE_B = v_temp where c.LOAD_ID = v_num;
end;
end;
/


Ошибка:
ORA-00942: таблица или представление пользователя не существует
ORA-06512: на "TEST.TRIGGER_TEST_Y", line 13
ORA-04088: ошибка во время выполнения триггера 'TEST.TRIGGER_TEST_Y'

При запуске:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare 
    v_tname VARCHAR2 (16);
    cr sys_refcursor; 
    v_temp NUMBER;
    v_num number; 
begin 
    select max (a.LOAD_ID) into v_num 
        from TEST.TABLE_LOAD_B a; 
    select '''' || b.TABLE_ID || '''' into v_tname 
        from TEST.TABLE_LOAD_B b 
            where b.LOAD_ID = v_num;
    open cr for 'select sum (BYTES) 
                    from dba_segments 
                        where SEGMENT_NAME = ' || v_tname; 
    fetch cr into v_temp; 
    dbms_output.put_line (v_temp);
    close cr;
    update TEST.TABLE_LOAD_B c set c.BYTE_B = v_temp where c.LOAD_ID = v_num;
end;


всё работает.
...
Рейтинг: 0 / 0
22.08.2017, 16:37
    #39508860
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
IlnovORA-00942: таблица или представление пользователя не существует ТОП №4
И на зачем здесь динамика?
...
Рейтинг: 0 / 0
22.08.2017, 16:39
    #39508861
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
IlnovНе могу понять причину ошибки.
Триггер:
Код: sql
1.
..


Ошибка:
ORA-00942: таблица или представление пользователя не существует
ORA-06512: на "TEST.TRIGGER_TEST_Y", line 13
ORA-04088: ошибка во время выполнения триггера 'TEST.TRIGGER_TEST_Y'

При запуске:
Код: sql
1.
..


всё работает.

проверь, что у пользователя TEST есть права reference на dba_segments
...
Рейтинг: 0 / 0
22.08.2017, 16:43
    #39508866
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Fogelправа reference на dba_segments
...
Рейтинг: 0 / 0
22.08.2017, 16:48
    #39508869
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
ElicFogelправа reference на dba_segments
s
...
Рейтинг: 0 / 0
22.08.2017, 16:59
    #39508875
Ilnov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Спасибо. Заработало. Простите за тупость...
...
Рейтинг: 0 / 0
23.08.2017, 09:56
    #39509133
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
IlnovСпасибо. Заработало. Простите за тупость...
странно что работает
1) інсерт может добавлять больше одной записи
2) в многопользоватьльской select max (a.LOAD_ID) сыграет злую шютку

.....
stax
...
Рейтинг: 0 / 0
23.08.2017, 10:34
    #39509150
NETClient
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с синтаксисом
Stax,

Колись, где ты работаешь, что у тебя так много свободного времени, чтобы писать развернутые ответы каждому вопрошающему. Удаленно берут?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с синтаксисом / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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