- Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 15 anos, 2 meses atrás por
rwarstat.
-
AutorPosts
-
23 de dezembro de 2010 às 5:07 pm #97425
apalmeira
ParticipanteOlá pessoal,
Continuo com a migração do Firebird para o Oracle 10g Ex.
Tenho a Stored Procedure abaixo funcionando no Firebird, porém, não sei como implementá-la no Oracle.
Quando um usuário ou uma tela é cadastrada, essa procedure é chamada para incluir os dados na tabela de permissoes. Ou seja, caso seja cadastrado um novo usuário, a procedure faz vários inserts na tabela permissoes com todas as telas existentes para o novo usuario, se for cadastrado uma nova tela, a procedure faz inserts na tabela permissoes com a nova tela para os usuários existentes.
Desde já agradeço!
CREATE PROCEDURE CADASTRA_PERMISSAO (
USUARIO_ID INTEGER,
TELA_ID INTEGER)
AS
DECLARE VARIABLE USUARIO INTEGER;
DECLARE VARIABLE TELA INTEGER;
BEGINIF(NOT :USUARIO_ID IS NULL) THEN
BEGIN
FOR
SELECT
ID
FROM
TELA
INTO
:TELA
DO
BEGIN
INSERT INTO PERMISSAO(TELA_ID,usuario_id) VALUES (:TELA,:USUARIO_ID);
END
END
ELSE IF(NOT :TELA_ID IS NULL) THENBEGIN
FOR
SELECT
ID
FROM
USUARIO
INTO
:USUARIO
DO
BEGIN
INSERT INTO PERMISSAO(TELA_ID,USUARIO_ID) VALUES (:TELA_ID,:USUARIO);
ENDEND
END
23 de dezembro de 2010 às 5:35 pm #97426leandrolbs
ParticipanteCara, da mesma forma que entendi tudo, eu não entendi nd…
na realidade achei essa prc meio muita confusa..rs.adaptei ela no Oracle, mais to sem base no momento, qualquer coisa mande as tabelas e testo aqui…
segue:
CREATE PROCEDURE CADASTRA_PERMISSAO(USUARIO_ID INTEGER, TELA_ID INTEGER)
AS
BEGIN
DECLAREIF NOT (USUARIO_ID IS NULL) THEN
BEGIN
FOR S IN (
SELECT ID FROM TELA
) LOOP
INSERT INTO PERMISSAO(TELA_ID, USUARIO_ID) VALUES(S.ID, USUARIO_ID);
END LOOP;END IF;
IF NOT (TELA_ID IS NULL) THEN
BEGIN
FOR S2 IN (
SELECT ID FROM USUARIO
) LOOP
INSERT INTO PERMISSAO(TELA_ID, USUARIO_ID) VALUES(TELA_ID,s2.ID);
END LOOP;
END IF;
END;
23 de dezembro de 2010 às 7:21 pm #97429rwarstat
ParticipanteLeandro,
Fiz uma alteração na procedure que tu modificou.
Tirei aquele os loops que haviam sido colocados e no lugar coloquei um insert into … select. Nesse caso a performance irá ficar melhor, uma vez que o loop irá causar uma demora desnecessária ao processo.CREATE PROCEDURE CADASTRA_PERMISSAO (USUARIO_ID INTEGER, TELA_ID INTEGER)
AS
BEGIN
IF NOT (USUARIO_ID IS NULL) THEN
INSERT INTO PERMISSAO (TELA_ID, USUARIO_ID)
(SELECT ID, USUARIO_ID FROM tela);
END IF;IF NOT (TELA_ID IS NULL) THEN INSERT INTO PERMISSAO (TELA_ID, USUARIO_ID) (SELECT TELA_ID, ID FROM usuario); END IF;END;
Abraço,
Roberto23 de dezembro de 2010 às 7:38 pm #97433leandrolbs
ParticipanteRoberto, com certeza é rápido, minha intenção foi converter o código Fire to Oracle, mais vlw pela dica nosso amigo terá mais opções.
23 de dezembro de 2010 às 8:03 pm #97434apalmeira
ParticipanteValeu galera, funcionou perfeitamente!
Vocês poderiam me indicar algum livro de PL/SQL?
Abraços
23 de dezembro de 2010 às 8:05 pm #97435rwarstat
ParticipanteSinceramente de PL/SQL nunca li nenhum livro até hoje.
O quê aprendi foi com um curso de poucas horas que me deu a noção e depois foi na internet, tanto em fóruns como vendo códigos já feitos.Abraço,
Roberto -
AutorPosts
- Você deve fazer login para responder a este tópico.