Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Вывод результата из dbms_output.put_line Oracle в TMemo Delphi  [new]
fragmaker
Member

Откуда:
Сообщений: 23
Приветствую, россияне! Собственно, вопрос из темы - каким образом реализовать следующее. Есть следующий код
begin
    dbms_output.put_line('Hello World!');
end;

Результат, т.е. 'Hello World!', требуется вывести на компонент TMemo формы приложения (событие любое: запуск приложения, нажатие на кнопку - не имеет значения). Может, кто подскажет, как это едят? Какими приправами балуетесь?
27 янв 20, 16:17    [22067286]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результата из dbms_output.put_line Oracle в TMemo Delphi  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26386
https://www.sql.ru/forum/791576/odac-dbms-output-kak
27 янв 20, 16:26    [22067295]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результата из dbms_output.put_line Oracle в TMemo Delphi  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31041

а нахрена?

Posted via ActualForum NNTP Server 1.5

27 янв 20, 16:26    [22067296]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результата из dbms_output.put_line Oracle в TMemo Delphi  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 60759
Блог
Задача распадается на три части. Сначала нужно прочитать описание dbms_output и узнать, каким образом можно прочитать то, что выведено через put_line. Затем нужно прочитать, каким образом можно получить информацию из Oracle в Delphi и вывести её в TMemo. И наконец, если какая-либо из предыдущих частей оказывается сложна в реализации - нужно хотя бы чуть-чуть научиться программировать.
27 янв 20, 16:27    [22067298]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результата из dbms_output.put_line Oracle в TMemo Delphi  [new]
fragmaker
Member

Откуда:
Сообщений: 23
softwarer, проблема как раз на 2 шаге - каким образом можно получить информацию из Oracle в Delphi. Нужно прочитать результат PL/SQL (процедура, функция, просто код, как в моём примере - не важно), который пишется в переменную или просто вывод через dbms_output.put_line! Не могу найти связь Oracle и Delphi в случае с PL/SQL!
29 янв 20, 15:02    [22068696]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результата из dbms_output.put_line Oracle в TMemo Delphi  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 60759
Блог
fragmaker
softwarer, проблема как раз на 2 шаге - каким образом можно получить информацию из Oracle в Delphi.

А что говорит гугль по запросу 'каким образом можно получить информацию из Oracle в Delphi' ?
29 янв 20, 15:42    [22068767]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результата из dbms_output.put_line Oracle в TMemo Delphi  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6599
fragmaker,

пользуюсь такой функцией:

CREATE OR REPLACE FUNCTION FUNC_GET_DBMS_OUTPUT 
RETURN CLOB 
IS
   Result   CLOB;
   sLine    varchar2(255);
   iStatus  integer;
BEGIN
   DBMS_LOB.CreateTemporary(Result,true);
   
   loop                  
      DBMS_OUTPUT.GET_LINE (sLine, iStatus); 
      exit when iStatus<>0;
      Result:=Result||sLine||chr(13)||chr(10);
   end loop;

   return(Result);
END FUNC_GET_DBMS_OUTPUT;
/


но, к сожалению, этот запрос возвращает пустой CLOB
select func_get_dbms_output from dual;


но можно успешно вызвать из PL/SQL-блока
declare
  sText varchar2(4000);
begin
  -- Test statements here
  DBMS_OUTPUT.put_line('Line 1');
  DBMS_OUTPUT.put_line('Line 2');
  DBMS_OUTPUT.put_line('Line 4');
  
  
  sText := FUNC_GET_DBMS_OUTPUT;
  
  dbms_output.put_line('<<<<<'||sText||'>>>>>');
end;
29 янв 20, 17:20    [22068881]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результата из dbms_output.put_line Oracle в TMemo Delphi  [new]
fragmaker
Member

Откуда:
Сообщений: 23
Задача решена. Всех благодарю за участие.
В моём случае используются компоненты UniDAC от Devart.
Решение (по нажатию кнопки)
procedure TForm1.Button1Click(Sender: TObject);
begin
  UniQuery1.SQL.Add('begin ' +
                        'dbms_output.enable(100);' + //-- размер в байтах, без enable текст отображаться не будет
                        'dbms_output.put_line(''Hello World'');' +
                        'dbms_output.get_line(:par_line, :par_status);' +
                    'end;');
  UniQuery1.Params.ParamByName('par_line').ParamType:= ptOutput; // обязательно задаём пераметры перед выполнением скрипта
  UniQuery1.Params.ParamByName('par_line').DataType:= ftString;
  UniQuery1.Params.ParamByName('par_status').ParamType:= ptOutput;
  UniQuery1.Params.ParamByName('par_status').DataType:= ftString;
  UniQuery1.Execute;
  Memo1.Lines[0]:= UniQuery1.Params.ParamByName('par_line').asString;
end;

Мастера форума дали наставление, следуя которому, можно познать истинный путь силы - это использование dbms_output.get_line, который записывает в переменные содержание dbms_output.put_line (если простыми словами). А дальше мурзилка по Oracle в помощь https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_output.htm#BABJCAJA

P.S. Знания должны принадлежать человечеству
5 фев 20, 13:42    [22073712]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результата из dbms_output.put_line Oracle в TMemo Delphi  [new]
defecator
Member

Откуда:
Сообщений: 39459
fragmaker
Задача решена. Всех благодарю за участие.
В моём случае используются компоненты UniDAC от Devart.
Решение (по нажатию кнопки)
procedure TForm1.Button1Click(Sender: TObject);
begin
  UniQuery1.SQL.Add('begin ' +
                        'dbms_output.enable(100);' + //-- размер в байтах, без enable текст отображаться не будет
                        'dbms_output.put_line(''Hello World'');' +
                        'dbms_output.get_line(:par_line, :par_status);' +
                    'end;');
  UniQuery1.Params.ParamByName('par_line').ParamType:= ptOutput; // обязательно задаём пераметры перед выполнением скрипта
  UniQuery1.Params.ParamByName('par_line').DataType:= ftString;
  UniQuery1.Params.ParamByName('par_status').ParamType:= ptOutput;
  UniQuery1.Params.ParamByName('par_status').DataType:= ftString;
  UniQuery1.Execute;
  Memo1.Lines[0]:= UniQuery1.Params.ParamByName('par_line').asString;
end;


Мастера форума дали наставление, следуя которому, можно познать истинный путь силы - это использование dbms_output.get_line, который записывает в переменные содержание dbms_output.put_line (если простыми словами). А дальше мурзилка по Oracle в помощь https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_output.htm#BABJCAJA

P.S. Знания должны принадлежать человечеству

В компонентах DevArt вовсе необязательно писать такие длинные портянкиДостаточно написать SQL.
А потом в дизачн-тайме указать типы входных и выходных параметров.
Будет ZERO кода
5 фев 20, 21:22    [22074209]     Ответить | Цитировать Сообщить модератору
 Re: Вывод результата из dbms_output.put_line Oracle в TMemo Delphi  [new]
fragmaker
Member

Откуда:
Сообщений: 23
defecator, всё верно! Результат составлялся именно для наглядности, как работает вывод результатов PL/SQL в компонентах от Devart, чтобы всё было в одном месте, не разделяя отдельно код sql Oracle и Delphi. Под копи-паст, так сказать...
7 фев 20, 08:03    [22075278]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить