- Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 7 anos, 6 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
26 de junho de 2017 às 6:37 pm #108823GeovaneParticipante
Caros bom dia, criei um Script no SQL, e preciso traduzir para Oracle, porém não tenho a minima noção de como fazer. Alguém poderia me ajudar? Segue abaixo Scripts.
/*01 – Declara variáveis externas da query*/
DECLARE @COLIGADA INTSET @COLIGADA=1
/*02 – Cria registro na GAUTOINC se não existir*/
IF NOT EXISTS (SELECT VALAUTOINC FROM GAUTOINC WHERE CODCOLIGADA=@COLIGADA AND CODSISTEMA=’F’ AND CODAUTOINC LIKE ‘CODCFO’)INSERT INTO GAUTOINC(CODCOLIGADA, CODSISTEMA, CODAUTOINC, VALAUTOINC)
SELECT @COLIGADA AS COLIGADA,
‘F’ AS CODSISTEMA,
‘CODCFO’ AS CODAUTOINC,
0 AS VALAUTOINC
;/*03 – Declara variáveis internas da query*/
DECLARE @MAX1 INT
DECLARE @MAX2 INT
DECLARE @TAMANHO INTSET @MAX1=ISNULL((SELECT VALAUTOINC FROM GAUTOINC WHERE CODCOLIGADA=@COLIGADA AND CODSISTEMA=’F’ AND CODAUTOINC LIKE ‘CODCFO’),0)
SET @MAX2=ISNULL((SELECT VALAUTOINC FROM GAUTOINC WHERE CODCOLIGADA=0 AND CODSISTEMA=’F’ AND CODAUTOINC LIKE ‘IDCFO’),0)
SET @TAMANHO=(SELECT LEN(TEXTO) FROM FPARAM WHERE CODCOLIGADA=@COLIGADA AND ID=1001)/*04 – Cria tabela base*/
SELECT *
INTO #CLIENTES
FROM (
SELECT @COLIGADA AS CODCOLIGADA, ‘FLÁVIO HIROYUKI NAKA’ AS NOME, ‘648.267.679-00’ AS CGCCFO UNION
SELECT @COLIGADA AS CODCOLIGADA, ‘LUANA SILVEIRA PAULA DA COSTA’ AS NOME, ‘049.696.549-21’ AS CGCCFO
) AS X
WHERE
NOT EXISTS (
SELECT Y.*
FROM FCFO Y (NOLOCK)
WHERE
Y.CODCOLIGADA=X.CODCOLIGADA AND
Y.CGCCFO=X.CGCCFO)/*05 – Realiza inclusão dos clientes*/
INSERT INTO FCFO(CODCOLIGADA, CODCFO, IDCFO, NOMEFANTASIA, NOME, CGCCFO, PAGREC, PESSOAFISOUJUR, CODTCF, ATIVO, TIPOCONTRIBUINTEINSS, RECCREATEDBY, RECCREATEDON, RECMODIFIEDBY, RECMODIFIEDON)
SELECT CODCOLIGADA,
REPLICATE(‘0’,@TAMANHO-LEN(CODCFO))+CONVERT(VARCHAR,CODCFO) AS CODCFO,
IDCFO,
NOMEFANTASIA,
NOME,
CGCCFO,
PAGREC,
PESSOAFISOUJUR,
CODTCF,
ATIVO,
TIPOCONTRIBUINTEINSS,
RECCREATEDBY,
RECCREATEDON,
RECMODIFIEDBY,
RECMODIFIEDON
FROM (
SELECT A.CODCOLIGADA,
@MAX1+(ROW_NUMBER() OVER(ORDER BY A.CODCOLIGADA)) AS CODCFO,
@MAX2+(ROW_NUMBER() OVER(ORDER BY A.CODCOLIGADA)) AS IDCFO,
A.NOME AS NOMEFANTASIA,
A.NOME AS NOME,
A.CGCCFO,
3 AS PAGREC,
‘F’ AS PESSOAFISOUJUR,
ISNULL(
(SELECT TOP 1 CODTCF FROM FTCF WHERE CODCOLIGADA=@COLIGADA),
(SELECT TOP 1 CODTCF FROM FTCF WHERE CODCOLIGADA=0)
) AS CODTCF,
1 AS ATIVO,
0 AS TIPOCONTRIBUINTEINSS,
‘imp.aberto’ AS RECCREATEDBY,
GETDATE() AS RECCREATEDON,
‘imp.aberto’ AS RECMODIFIEDBY,
GETDATE() AS RECMODIFIEDON
FROM #CLIENTES A (NOLOCK)
WHERE
NOT EXISTS (
SELECT X.*
FROM FCFO X (NOLOCK)
WHERE
X.CODCOLIGADA=A.CODCOLIGADA AND
X.CGCCFO=A.CGCCFO)
) AS FINAL/*06 – Ajusta GAUTOINC*/
SET @MAX1=ISNULL((SELECT MAX(CODCFO) FROM FCFO WHERE CODCOLIGADA=@COLIGADA),0)
SET @MAX2=ISNULL((SELECT MAX(IDCFO) FROM FCFO),0)UPDATE GAUTOINC SET VALAUTOINC=@MAX1 WHERE CODCOLIGADA=@COLIGADA AND CODSISTEMA=’F’ AND CODAUTOINC LIKE ‘CODCFO’
UPDATE GAUTOINC SET VALAUTOINC=@MAX2 WHERE CODCOLIGADA=0 AND CODSISTEMA=’F’ AND CODAUTOINC LIKE ‘IDCFO’/*06 – Dropa tabela base temporária*/
DROP TABLE #CLIENTES26 de junho de 2017 às 8:48 pm #108824José Laurindo ChiappaModeradorColega, vou tentar te dar uma ajuda geral MAS se vc vai passar a trabalhar com RDBMS Oracle, é ** COMPLETAMENTE OBRIGATÓRIO ** vc dar um estudada nos Conceitos do RDBMS Oracle (há DIVERSOS conceitos que vão mudar COMPLETAMENTE, como Controle de Transação, Paralelismo de SQL, métodos e middleware de conexão, etc, etc, etc), na implementação do RDBMS Oracle para a linguagem SQL (aqui vai ser muito mais pequenos detalhes, o geral do SQL é bem parecido em ambos os RDBMS, ie, SQLSERVER e Oracle) , na linguagem PL/SQL ** E **, principalmente, nas built-ins/funcionalidades específicas Oracle : esses dois últimos vão ser aprendizados ** BASTANTE DIFERENTES ** , há Muuuuitos Conceitos (como o fato do PL/SQL ser uma linguagem totalmente voltada ao back-end, não possuindo nem comando de PRINT de mensagens, ou o fato do PL/SQL possuir datatypes extras além dos do databasepor exemplo, entre outros) e Muuitas Sintaxes diferentes…. SE não o fez, comece pra Ontem esses estudos….
Muito bem : não vou tirar o seu prazer de fazer por si mesmo (inclusive para servir de Oportunidade de Aprendizado) mas vou indicar as principais diferenças de Conceitos e de Sintaxes que ao que vejo podem te pegar :
=> as variáveis no PL/SQL até podem em muitos ambientes começar com @ mas ** diversos ** ambientes de programação (como o sqlplus, para citar um) usam o @ para funções próprias (chamar scripts, no caso do sqlplus) então Recomendo que vc troque todos os @variável por v_nomedavariável
=> o PL/SQL funciona com o conceito de BLOCOs, ie : vc tem uma seção ÚNICA de DECLARE aonde vc declara suas variáveis todas (não é um DECLARE por linha), e esse seção TEM que ficar em cima de um indicador BEGIN
=> para Atribuir um valor para uma variável programaticamente não se usa SET, a sintaxe é nomedavariavel := valorainserir;
=> o operador de Nulidade é IS NULL , e de não-nulidade é IS NOT NULL
=> todo SELECT ** ou ** tem que ter seus resultados guardados em variáveis (via SELECT colunasdesejadas INTO listadevariáveisseparadaspor vírgula), ** ou ** deve ser processado num LOOP, ** ou ** deve ter seu resultset inserido numa tabela
=> para fazer um IF em cima do resultado de um SELECT, esse resultado TEM que estar armazenado em variável ou em tabela
=> as tabelas-temporárias no RDBMS Oracle se chamam Global Temporary Table, e via de regra são criadas vazias FORA DO PROGRAMA que as usa (na implementação do Aplicativo, junto com o resto do modelo físico) e Não precisam ser dropadas/esvaziadas no final do uso
======>>>>> ALTERANDO esses pontos creio que teu script já vai estar praticamente pronto pra rodar no RDBMS Oracle…
[]s
Chiappa
27 de junho de 2017 às 12:40 am #108826GeovaneParticipanteQuando as Declarações e o uso do Begin e END peguei aqui, mas tem muita coisa que tem que mudar também. Tá osso hehe
27 de junho de 2017 às 1:26 am #108827José Laurindo ChiappaModeradorDiscordo completamente : joga num Editor de texto, substitui @ por v_ , INT por INTEGER, ISNULL por IS NULL , remove os SETs e adiciona o operador := entre a variável e o valor, coloca as declarações de vars todas num só DECLARE ** e ** (usando os conceitos que te expliquei) onde tiver IF EXISTS monte um SELECT INTO e use GTT como tabela-temporária – pronto, não deve demorar mais de 10 minutos E só com isso vc já deve chegar fácil nums 90% da conversão…. Não Vejo como algo do outro mundo, alienígena e incompreensível….
Repito, não vou fazer para que vc tenha a oportunidade de aprender, mas não é tããão complexo assim…[]s
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.