Вернуть результат выполнения функции FastReport

morhellene
Дата: 26.06.2019 09:53:25
Есть query вида
DECLARE
a1 varchar2(1024);
a2 varchar2(2024);
begin
a1:= function(:par);
dbms_output.put_line(a1);
end;


Вопрос как забрать результат выполнения dbms_output.put_line(a1) (возвращает результат успешно/неуспешно) в отчет для дальнейшего анализа? Точнее как просто передать какой-то результат выполнения функции в
Через select ...from dual функцию оформить не выйдет.
Спасибо
Кроик Семён
Дата: 26.06.2019 10:09:19
из моего проекта:

   select FUNC_GET_DBMS_OUTPUT from dual;


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;
Кроик Семён
Дата: 26.06.2019 10:11:33
P.S.

morhellene
Через select ...from dual функцию оформить не выйдет.


не понял мысли
morhellene
Дата: 26.06.2019 10:17:47
Кроик Семён, select function(:par) from dual
дает
ORA-14552: невозможно выполнение DDL, фиксации или отката внутри запроса или DML операции
Кроик Семён
Дата: 26.06.2019 11:48:14
Это код функции. Её нужно создать. Она сохранится в базу и будет там существовать под именем FUNC_GET_DBMS_OUTPUT

Впоследствии её можно будет вызвать из SQL
Кроик Семён
Дата: 26.06.2019 12:00:31
P.S.
можно и без создания функции конечно, т.е. воспользоваться таким анонимным SQL блоком :
var
   Q     : TOracleQuery; // DOA
   sTxt  : string;
begin
   Q := TOracleQuery.Create(nil);
   try
      Q.Session := .....
      
      Q.DeclareVariable(':RES', otCLOB);

      Q.SQL.Add('declare');
      Q.SQL.Add('   sLine    varchar2(255);');
      Q.SQL.Add('   iStatus  integer;');
      Q.SQL.Add('begin');
      Q.SQL.Add('   DBMS_LOB.CreateTemporary(:RES, true);');
      Q.SQL.Add('');
      Q.SQL.Add('   loop');
      Q.SQL.Add('      DBMS_OUTPUT.GET_LINE (sLine, iStatus);');
      Q.SQL.Add('      exit when iStatus<>0;');
      Q.SQL.Add('      :RES := :RES||sLine||chr(13)||chr(10);');
      Q.SQL.Add('   end loop;');
      Q.SQL.Add('end;'   

      Q.Execute();
   
      sTxt := Q.GetVariable(':RES');
   finally
      FreeAndNil(Q);
   end;
   
   ShowMessage('DBMS_OUTPUT = '+#13#10+
               sTxt);
end;               


но с функцией все-таки элегантнее на мой взгляд
DimaBr
Дата: 26.06.2019 13:44:47
В каком месте тут фигурирует FastReport ?
Кроик Семён
Дата: 26.06.2019 14:43:44
Это следующий шаг. Не забегайте вперёд.