2011-12-24 90 views
12

Estoy tratando de aprender los cursores básicos usando PostgreSQL. Esta es mi secuencia de comandos:Cursores de PostgreSQL

DECLARE cur_employees CURSOR FOR 
    SELECT * 
    FROM employee 

CLOSE cur_employees 

Quiero recorrer la lista y dar salida a los que están activos. ¿Donde debería empezar?

+1

Comience añadiendo una cláusula WHERE que seleccione las activas. – aib

+2

Lea el [capítulo sobre cursores en el manual] (http://www.postgresql.org/docs/9.1/interactive/plpgsql-cursors.html). –

+0

Hice lo que me dijo: DECLARE cur_employees cursor para SELECT * DE empleado donde = activos 'activos' cur_employees CERRAR pero yo estoy recibiendo el siguiente error: – Karl

Respuesta

24

Es muy raro que desee utilizar explícitamente cursores en PostgreSQL, incluso al procesar los resultados de la consulta en plpgsql. Este es un contraste marcado de muchas otras bases de datos SQL donde se usan casi todo el tiempo.

En plpgsql simplemente podría escribir algo como:

DECLARE 
    emp employee%rowtype; 
BEGIN 
    FOR emp IN SELECT * FROM employee LOOP 
    IF emp.active THEN 
     RAISE INFO 'Active: %', emp.employee_id 
    END IF; 
    END LOOP; 
END 

En lo anterior, las ofertas plpgsql manejador de lenguaje con apertura, encuadernación, ir a buscar y cierre en sí (más en declarations y control structures).

Con PostgreSQL desde 9.0, puede simplemente ejecutar plpgsql usando un bloque "DO". Para versiones anteriores, necesita crear una función y seleccionarla. Si está buscando el equivalente PostgreSQL de, por ejemplo, iterar a través de un resultado con un cursor en SQL Server, eso es lo que es. Tenga en cuenta que la iteración, etc., es , no parte del dialecto SQL, solo parte de plpgsql (o cualquiera de los otros idiomas procesados).

La sintaxis "DECLARE CURSOR xxx" en el nivel de SQL puede usarse como esto:

DECLARE cur_employees CURSOR FOR SELECT * FROM employee; 
FETCH NEXT FROM cur_employees; 
// etc.. 
CLOSE cur_employees; 

Esto puede ser usado para obtener cuidado sólo una parte del conjunto de resultados de la consulta. Sin embargo, no es habitual utilizarlos, ya que normalmente el controlador del cliente proporcionará algún tipo de funcionalidad para hacerlo (por ejemplo, conjuntos de resultados desplazables en JDBC). También puede devolver cursores desde funciones similares a Oracle, aunque nuevamente es un caso de uso comparativamente raro.

+4

+1 Respuesta de alta calidad una vez más. –

+1

Y recuerde que el 90% o más de lo que las personas intentan usar para los custors se manejarían mejor con las operaciones basadas en conjuntos. Prácticamente nunca debería pensar en recorrer un conjunto de datos y nadie, excepto un dba experimentado, debería considerar escribir un cursor. Esta es una técnica que no debes aprender hasta que seas un adulto mayor y saber cuándo es apropiada. Si solo está aprendiendo SQl, omita este durante aproximadamente diez años. – HLGEM

0

Generalmente, uno tiene un DECLARACIÓN para el cursor, luego un ABRIR del cursor (que materializa el conjunto de resultados), múltiples operaciones FETCH para recuperar las filas del conjunto de resultados individualmente, y luego uno hace un CIERRE del cursor .

Parece que tiene un DECLARE seguido de un CERRAR. Por lo tanto, su error de sintaxis, ya que nunca hizo un ABRIR.

+0

Hm. Karl no mencionó si quiere usar los cursores con SQL o con pl/pgsql.Para SQL no hay 'OPEN', porque eso es hecho implícitamente por' DECLARE'. –

Cuestiones relacionadas