【问题标题】:Sql Server to Oracle - Change procedures and view syntaxSql Server 到 Oracle - 更改过程和查看语法
【发布时间】:2020-03-04 04:33:10
【问题描述】:

我在 sql server 中有这个过程,它执行计算日期的逻辑并为应用程序返回此信息,但不幸的是我将不得不切换到 oracle 数据库,所以我希望你能帮助我了解我必须在语法上进行哪些更改.

P.S:没用过oracle数据库

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

结束

【问题讨论】:

    标签: oracle plsql database-migration


    【解决方案1】:

    如果您查看 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;
    

    我并不是说这是您的理想答案或什至是答案,但该功能可以帮助您快速开始。

    从 SQL Server 到 Oracle 的一件大事 - 我看到的很多 SQL Server 存储过程只是要运行的查询。

    Oracle 存储过程不只是设置为“愚蠢”的 SQL 语句。它的目的是处理数据。因此,如果您不想改变行为,您必须做的一件事是,您的应用程序需要获取过程的结果,没有运行代码,在使用 PL/SQL 时获取查询结果。

    这在12c and higher versions of Oracle where we have added support for implicit results 中要容易一些,但您必须添加对 DBMS_SQL.RETURN_RESULT 的调用才能获取它们。

    【讨论】:

      猜你喜欢
      • 2015-11-26
      • 2013-04-16
      • 2023-04-09
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 2020-08-06
      • 2015-08-03
      • 2022-11-04
      相关资源
      最近更新 更多