Mostrando postagens com marcador Cursor. Mostrar todas as postagens
Mostrando postagens com marcador Cursor. Mostrar todas as postagens

domingo, 26 de maio de 2013

Cursor em SQL-Server (Números Primos)

Lembrando que um cursor deve ser usado somente quando não é possível resolver o que se necessita com apenas SELECT, Para o nosso exemplo de Cursor, utilizo números que estão em uma "Tabela" e quero saber quais deles são primos.


DECLARE @ID        INT
DECLARE @DESCRICAO VARCHAR(100)
DECLARE @DIVISOR   INT
DECLARE @PRIMO     BIT
--Declaração de um Cursor.
DECLARE CUR CURSOR FOR SELECT 1 ID,'Um'   DESCRICAO  UNION ALL
                       SELECT 2,   'Dois'            UNION ALL
                       SELECT 3,   'Tres'            UNION ALL
                       SELECT 4,   'Quatro'          UNION ALL
                       SELECT 5,   'Cinco'           UNION ALL
                       SELECT 6,   'Seis'            UNION ALL
                       SELECT 7,   'Sete' 
--Abrindo um Cursor para uso.
OPEN CUR
--Leitura da tupla do cursor dentro das variáveis
FETCH NEXT FROM CUR INTO @ID, @DESCRICAO
--Caso exista dados no Select do Cursor
WHILE @@FETCH_STATUS = 0
BEGIN  
    SET @PRIMO   = 1     --Número é primo
    SET @DIVISOR = @ID-1 
    WHILE @DIVISOR > 1
    BEGIN
       IF @ID % @DIVISOR = 0 
       BEGIN
          SET @PRIMO = 0 --Número não é primo
          BREAK
       END
       SET @DIVISOR = @DIVISOR -1
    END
    IF @PRIMO = 0 PRINT 'O número '+@DESCRICAO+' não é primo!'
    ELSE          PRINT 'O número '+@DESCRICAO+' é primo!'
    --Leitura da tupla do cursor dentro das variáveis
    FETCH NEXT FROM CUR INTO @ID, @DESCRICAO
END
--Fechando um cursor.
CLOSE CUR            
--Liberando o cursor da memória (obrigatório)
DEALLOCATE CUR                       

Resultado:

O número Um é primo!
O número Dois é primo!
O número Tres é primo!
O número Quatro não é primo!
O número Cinco é primo!
O número Seis não é primo!
O número Sete é primo!

quarta-feira, 17 de abril de 2013

Oracle - PL-SQL - Comandos (Cursores)

Apresento como trabalhar com Cursores no Oracle


Exemplo cursor LOOP Simples


SET SERVEROUTPUT ON
DECLARE CURSOR cur IS  SELECT * FROM tb_tabela;
        linha cur%ROWTYPE;
BEGIN
    OPEN cur;
    LOOP
        FETCH cur INTO linha;
        EXIT WHEN cur%NOTFOUND;       
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
    END LOOP;
    CLOSE cur;
END;


Exemplo cursor LOOP WHILE


SET SERVEROUTPUT ON
DECLARE CURSOR cur IS SELECT * FROM tb_tabela;       
        linha cur%ROWTYPE;
BEGIN
    OPEN cur;
    FETCH cur INTO linha;
    WHILE cur%FOUND LOOP      
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
        FETCH cur INTO linha;    
    END LOOP;
    CLOSE cur;
END;


Exemplo cursor LOOP FOR


SET SERVEROUTPUT ON
DECLARE CURSOR cur IS  SELECT * FROM tb_tabela;       
BEGIN
    FOR linha IN cur LOOP
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
    END LOOP;
END;


Exemplo cursor LOOP FOR IMPLICITO


SET SERVEROUTPUT ON
BEGIN
    FOR linha IN (SELECT * FROM tb_tabela) LOOP
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
    END LOOP;
END;


Exemplo cursor LOOP FOR (FOR UPDATE)


DECLARE CURSOR cur SELECT * FROM tb_tabela FOR UPDATE;
             variavel NUMBER;
BEGIN
    variavel := 1.0;
    FOR linha IN cur LOOP
        IF linha.campo_media >7 THEN
            variavel := 1.5;
        END IF;

        UPDATE tb_tabela
           SET campo_tabela = variavel
         WHERE CURRENT OF cur;
    END LOOP;
END;


cur%ISOPEN --- VERIFICANDO CURSOR ABERTO


DECLARE CURSOR cur SELECT * FROM tb_tabela 
IF cur%ISOPEN THEN
 CLOSE cur;
END IF;
OPEN cur;


SQL%FOUND oposto SQL%NOTFOUND


SET SERVEROUTPUT ON
DELETE FROM tb_tabela WHERE condicao_verdadeira;
 
IF SQL%FOUND THEN  -- Sucesso na Cláusula DELETE
       DBMS_OUTPUT.PUT_LINE( 'Linhas afetadas na instrução DELETE: '|| TO_CHAR(SQL%ROWCOUNT));
END IF;


tb_tabela.campo_tabela%TYPE
Declarando variável do mesmo tipo de uma coluna de uma tabela



DECLARE variavelCampo tb_tabela.campo_tabela%TYPE; 


tb_tabela%ROWTYPE
Declarando uma variável com estrutura de uma tupla de uma tabela



DECLARE linha tb_tabela%ROWTYPE; 


Criando um Tipo de dados


DECLARE 
    TYPE novoTipo IS TABLE OF tb_tabela.campo_tabela%TYPE;
    variavelNovoTipo  novoTipo;
    CURSOR cur IS  
        SELECT campo_tabela
          FROM tb_tabela 
         WHERE condicao_verdadeira;

BEGIN
    OPEN cur;
    FETCH cur BULK COLLECT INTO variavelNovoTipo;
    CLOSE cur;

    FOR i IN variavelNovoTipo.FIRST .. variavelNovoTipo.LAST 
    LOOP
        DBMS_OUTPUT.PUT_LINE( variavelNovoTipo(i) );
    END LOOP;
END;