SQL Server для Oracle - изменить процедуры и посмотреть синтаксис - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть эта процедура на сервере sql, которая выполняет эту логику вычисления дат и возвращает эту информацию для приложения, но, к сожалению, мне придется переключиться на базу данных Oracle, поэтому я хотел бы, чтобы ваша помощь знала, что я должен изменить в синтаксисе.

PS: Никогда не использовал базу данных оракула

CREATE PROCEDURE [dbo].[SP_ObterDadosApontamentosOperacional]
@dataInicio as dateTime = null,
@dataFim as datetime = null,
@embarcacaoId as varchar(50) = null

AS
BEGIN

if(@dataInicio is null)
begin
    set @dataInicio = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
end

if(@dataFim is null)
begin
    set @dataFim = (DATEADD(ms, -3, DATEADD(dd, DATEDIFF(dd, 0, GetDate()), 0)) +1)
end


select 
    codigoOperacao.Id           as 'Id',
    codigoOperacao.Descricao    as 'Descricao',
    codigoOperacao.Codigo       as 'CodigoOperacao',
    count(codigoOperacao.Codigo) as 'TotalUnitario'
into #parcial
from INFO_APONTAMENTO as apontamento
inner join CODIGOS_OPERACAO as codigoOperacao on codigoOperacao.Id = apontamento.CodigosDeOperacao_Id
where apontamento.DataCadastro between @dataInicio and @dataFim
and ((apontamento.Barco_Id = @embarcacaoId) or @embarcacaoId is null)

group by
    codigoOperacao.Codigo,
    codigoOperacao.Descricao,
    codigoOperacao.Id   


/*--------------------------------------------*/

   select 
        Id,
        Descricao,
        CodigoOperacao  ,
        DataInicio  ,   
        DataTermino ,
    DATEDIFF(MINUTE,DataInicio,DataTermino)
    into #tempApontamentosPorHora
    from #tempApontamentos
    where DataInicio is not null
    and DataTermino is not null

declare @somaTotal as int = (select     sum(totalUnitario) from #parcial)
select *, @somaTotal as TotalAgregado from #parcial

end

1 Ответ

2 голосов
/ 07 ноября 2019

Если вы посмотрите на Oracle SQL Developer, в него встроен переводчик.

Вот что он пытается сделать с вашим T-SQL

/*Global Temporary Tables:2 *//* Translation Extracted DDL For Required Objects*/
CREATE GLOBAL TEMPORARY TABLE tt_parcial
AS (
   SELECT codigoOperacao.Id Id  ,
   codigoOperacao.Descricao Descricao  ,
   codigoOperacao.Codigo CodigoOperacao  ,
   0  TotalUnitario  
     FROM INFO_APONTAMENTO apontamento
     JOIN CODIGOS_OPERACAO codigoOperacao   ON codigoOperacao.Id = apontamento.CodigosDeOperacao_Id
   WHERE 1=2
);
/
CREATE GLOBAL TEMPORARY TABLE tt_tempApontamentosPorHora
AS (
   SELECT Id ,
   Descricao ,
   CodigoOperacao ,
   DataInicio ,
   DataTermino ,
   utils.datediff('MINUTE', DataInicio, DataTermino) 
     FROM tt_tempApontamentos
   WHERE 1=2
);
/



CREATE OR REPLACE PROCEDURE SP_ObterDadosApontamentosOperacional
(
  iv_dataInicio IN DATE DEFAULT NULL ,
  iv_dataFim IN DATE DEFAULT NULL ,
  v_embarcacaoId IN VARCHAR2 DEFAULT NULL 
)
AS
   v_dataInicio DATE := iv_dataInicio;
   v_dataFim DATE := iv_dataFim;
   v_somaTotal NUMBER(10,0) := ( SELECT SUM(totalUnitario)  
     FROM tt_parcial  );
   v_cursor SYS_REFCURSOR;

BEGIN
   IF ( v_dataInicio IS NULL ) THEN

   BEGIN
      v_dataInicio := utils.dateadd('DAY', utils.datediff('DAY', 0, SYSDATE), 0) ;

   END;
   END IF;
   IF ( v_dataFim IS NULL ) THEN

   BEGIN
      v_dataFim := (utils.dateadd('MS', -3, utils.dateadd('DD', utils.datediff('DD', 0, SYSDATE), 0)) + 1) ;

   END;
   END IF;
   DELETE FROM tt_parcial;
   UTILS.IDENTITY_RESET('tt_parcial');

   INSERT INTO tt_parcial ( 
    SELECT codigoOperacao.Id Id  ,
           codigoOperacao.Descricao Descricao  ,
           codigoOperacao.Codigo CodigoOperacao  ,
           COUNT(codigoOperacao.Codigo)  TotalUnitario  
      FROM INFO_APONTAMENTO apontamento
             JOIN CODIGOS_OPERACAO codigoOperacao   ON codigoOperacao.Id = apontamento.CodigosDeOperacao_Id
     WHERE  apontamento.DataCadastro BETWEEN v_dataInicio AND v_dataFim
              AND ( ( apontamento.Barco_Id = v_embarcacaoId )
              OR v_embarcacaoId IS NULL )
      GROUP BY codigoOperacao.Codigo,codigoOperacao.Descricao,codigoOperacao.Id );
   /*--------------------------------------------*/
   DELETE FROM tt_tempApontamentosPorHora;
   UTILS.IDENTITY_RESET('tt_tempApontamentosPorHora');

   INSERT INTO tt_tempApontamentosPorHora ( 
    SELECT Id ,
           Descricao ,
           CodigoOperacao ,
           DataInicio ,
           DataTermino ,
           utils.datediff('MINUTE', DataInicio, DataTermino) 
      FROM tt_tempApontamentos 
     WHERE  DataInicio IS NOT NULL
              AND DataTermino IS NOT NULL );
   OPEN  v_cursor FOR
      SELECT * ,
             v_somaTotal TotalAgregado  
        FROM tt_parcial  ;
      DBMS_SQL.RETURN_RESULT(v_cursor);

EXCEPTION WHEN OTHERS THEN utils.handleerror(SQLCODE,SQLERRM);
END;

Я не говорю, чтоэто ваш IDEAL-ответ или даже THE-ответ, но есть функция, которая поможет вам начать работу.

Одна важная вещь от SQL Server до Oracle - многие хранимые процедуры SQL Server, которые я вижу, являются просто запросамидля запуска.

Хранимые процедуры Oracle не являются просто «тупыми» операторами SQL. Он предназначен для обработки данных. Итак, одна вещь, которую вам нужно сделать, если вы не хотите, чтобы поведение изменялось, вашему приложению нужно будет получить результаты вашей процедуры, кода выполнения нет, получить результаты запроса при работе с PL / SQL.

Это немного проще в 12c и более поздних версиях Oracle, где мы добавили поддержку неявных результатов , но вам нужно добавить вызов DBMS_SQL.RETURN_RESULT, чтобы получить их.

...