powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблемы с синтаксисом
21 сообщений из 21, страница 1 из 1
Проблемы с синтаксисом
    #39506944
Ilnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Просьба помочь с синтаксисом.
Необходимо в select указать динамическую таблицу, название которой будет генериться другим select.
К примеру:
select * from qaz
где qaz это результат запроса select name from table1 where id = 1.
В интернете много примеров, но ни один из них не выдал необходимого результата.
Спасибо.
...
Рейтинг: 0 / 0
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #39507027
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilnov
Всё выполняется, только не выводит результат, чтобы понять, правильно выполняется или нет. Что делаю не так?

нет цыкла с fetch

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

зы
как указал Fogel курсор "желательно" закрывать
close cr;
.....
stax
...
Рейтинг: 0 / 0
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #39507495
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilnov,

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

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

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

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

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

.....
stax
Если не сложно поделиться опытом, то как (для понимания)?
...
Рейтинг: 0 / 0
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #39508860
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IlnovORA-00942: таблица или представление пользователя не существует ТОП №4
И на зачем здесь динамика?
...
Рейтинг: 0 / 0
Проблемы с синтаксисом
    #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
Проблемы с синтаксисом
    #39508866
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelправа reference на dba_segments
...
Рейтинг: 0 / 0
Проблемы с синтаксисом
    #39508869
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicFogelправа reference на dba_segments
s
...
Рейтинг: 0 / 0
Проблемы с синтаксисом
    #39508875
Ilnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Заработало. Простите за тупость...
...
Рейтинг: 0 / 0
Проблемы с синтаксисом
    #39509133
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IlnovСпасибо. Заработало. Простите за тупость...
странно что работает
1) інсерт может добавлять больше одной записи
2) в многопользоватьльской select max (a.LOAD_ID) сыграет злую шютку

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

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


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