Если вы посмотрите на 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, чтобы получить их.