powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / динамический sql (NDS): перебор OUT переменных процедуры
11 сообщений из 11, страница 1 из 1
динамический sql (NDS): перебор OUT переменных процедуры
    #39612082
rtyts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
Возможно ли реализовать такое:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
PROCEDURE sp1 
         (id_in IN NUMBER        
        , prm1_out OUT NUMBER        
        , prm2_out OUT NUMBER        
        , prm3_out OUT NUMBER        )
AS
    i NUMBER := 1;
    l_sqlquery VARCHAR2(200);
    l_sqlinto  VARCHAR2(200);

BEGIN
LOOP
  l_sqlQuery:='SELECT smth INTO prm'||i||'_out FROM tbl WHERE _ID='||id_in||'';
EXECUTE IMMEDIATE l_sqlQuery;
i:=i+1;
EXIT WHEN i>3;
END LOOP;
END;



так хотелось бы, но не работает из-за INTO
пробовал так

Код: plsql
1.
EXECUTE IMMEDIATE l_sqlQuery INTO l_sqlinto;



где l_sqlinto пытался присвоить также:
Код: plsql
1.
EXECUTE IMMEDIATE 'l_sqlinto:=prm'||i||'_out';


ругается также:
ORACLEORA-00900: invalid SQL statement

так что, можно саму идею реализовать? если да, соотв как?
...
Рейтинг: 0 / 0
динамический sql (NDS): перебор OUT переменных процедуры
    #39612100
Бельфя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так селект в таком варианте вернет несколько строк и процедура упадет.
Лучше делать курсором, имхо.
Код: 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.
procedure sp1(id_in    in number
             ,prm1_out out number
             ,prm2_out out number
             ,prm3_out out number) as
  i          number := 1;
  l_sqlquery varchar2(200);
  l_sqlinto  varchar2(200);

begin
  for cur in (select *
                from (select smth
                            ,row_number() over(order by null) rn
                        from tbl
                       where _id = id_in)
               order by rn)
  loop
    case cur.rn
      when 1 then
        prm1_out := cur.cmth;
      when 2 then
        prm1_out := cur.cmth;
      when 3 then
        prm1_out := cur.cmth;
      else
        exit;
    end case;
  end loop;
end;



А какую задачу пытаетесь решить? Может быть лучше делать не много выходных параметров, а один табличного типа?
...
Рейтинг: 0 / 0
динамический sql (NDS): перебор OUT переменных процедуры
    #39612113
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
rtyts,

странного хотите - область видимости у них разная.
Да и данном примере вообще это непонятно к чему, уж перечислить 3 параметра не проблема:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
PROCEDURE sp1 
         (id_in IN NUMBER        
        , prm1_out OUT NUMBER        
        , prm2_out OUT NUMBER        
        , prm3_out OUT NUMBER        )
AS
BEGIN
   SELECT 
          smth
        , smth
        , smth 
   INTO
          prm1_out
        , prm2_out
        , prm3_out
   FROM tbl t 
   WHERE t._ID=sp1.id_in;
END;
...
Рейтинг: 0 / 0
динамический sql (NDS): перебор OUT переменных процедуры
    #39612114
rtyts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БельфяА какую задачу пытаетесь решить? Может быть лучше делать не много выходных параметров, а один табличного типа?
Да, я уже решил пойти другим путём. Чисто научный интерес. Я в оракле нуб, поэтому мог упустить детали, даже тупо неверный синтаксис.
Скажем так, мне интересно, может ли именно NDS потянуть такой таск или нет или затраты слишком высоки...
БельфяТак селект в таком варианте вернет несколько строк
нет. вернёт только одну строку. я секцию where сильно уменьшил для топика. но смысл в том, что SELECT тот однозначно вернёт только одно значение.
...
Рейтинг: 0 / 0
динамический sql (NDS): перебор OUT переменных процедуры
    #39612115
rtyts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender, согласен.
я уже передал интерфейс процедуры. остался спорт интерес к NDS.
...
Рейтинг: 0 / 0
динамический sql (NDS): перебор OUT переменных процедуры
    #39612161
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rtytsмне интересно, может ли именно NDS потянуть такой таск или нетМожет. Буде задача внятно сформулирована. На данный момент задача детерминирована на момент компиляции, NDS не нужен.
...
Рейтинг: 0 / 0
динамический sql (NDS): перебор OUT переменных процедуры
    #39612294
rtyts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic , что ещё добавить в описание задачи? Кстати, OUT параметров аж 38. Сегодня прислали закомиченную последню версия интерфейса процедуры. Вот думал их циклом перебрать.
...
Рейтинг: 0 / 0
динамический sql (NDS): перебор OUT переменных процедуры
    #39612420
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rtytsКстати, OUT параметров аж 38.Без разницы. Неопределённости это всё равно не вносит.
21244420 . И не пытайся совать то, что не понимаешь, туда, куда не понимаешь.
...
Рейтинг: 0 / 0
динамический sql (NDS): перебор OUT переменных процедуры
    #39612805
rtyts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicИ не пытайся совать то, что не понимаешь, туда, куда не понимаешь.
ну так чтобы понимать, об этом надо где-то прочитать так? или есть тут кто-то уже родился с пониманием?
область видимости у них разная
раз уж это ответ, то я делаю вывод, что решить вначале описанную задачу тем способом, которым я хочу нельзя.
...
Рейтинг: 0 / 0
динамический sql (NDS): перебор OUT переменных процедуры
    #39612810
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rtytsобласть видимости у них разная
раз уж это ответ, то я делаю вывод, что решить вначале описанную задачу тем способом, которым я хочу нельзя.А куда уже больше разжевывать?
Переменные из вызывающего блока не видны в динамическом тексте.
Можно объявить массив, но потом все равно надо будет раскидать элеменеты массива по соответствующим переменным.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure sp1(id_in    in number,
              prm1_out out number,
              prm2_out out number,
              prm3_out out number) as
  i          number := 1;
  l_sqlquery varchar2(200);
  l_sqlinto  varchar2(200);
  type arr is table of varchar2(30) index by binary_integer;
  a arr;
begin
  loop
    l_sqlquery := 'SELECT smth FROM tbl WHERE ID=' || id_in;
    execute immediate l_sqlquery into a(i);
    i := i + 1;
    exit when i > 3;
  end loop;
  
  prm1_out := a(1);
  prm2_out := a(2);
  prm3_out := a(3);    
end;



Учитывая как задача была поставлена - был дан ответ как ее реализовать.
Ты же не потрудился объяснить откуда вообще желание использовать динамику.

PS. Когда ругается "invalid SQL statement" не нало быть Эйнштейном, чтоб вывести динамический текст в output и попытаться выполнить вручную.
...
Рейтинг: 0 / 0
динамический sql (NDS): перебор OUT переменных процедуры
    #39612812
rtyts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop , так я всё понял. после того первого ответа про видимость. После, уважаемый Elic , вроде как намекнул, что всё таки можно и что для того, чтобы можно было надо уточнить задачу. но больше её уточнить некуда. у меня есть интерфейс процедуры, который мне передан другим разработчиком. моя задача реализовать body внутри которого мне надо присвоить 38-ми выходным параметрам значения. я хотел эти переменные перебрать в цикле, в котором я и получаю эти значения.

dbms_photoshop , ваш решение очевидно. как раз такого я хотел избежать, но видимо не получится.

Всем спасибо!
case closed!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / динамический sql (NDS): перебор OUT переменных процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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