Procedimiento almacenado de teradata simple

La web parece un poco corta en ejemplos de trabajo para algo que debería ser bastante común. Un simple ejemplo de Jane de "Consígueme algunos registros". Este es mi primer proceso almacenado y todo lo que quiero es ver algunos registros. ¿Por qué es tan difícil de voltear? ;-) Me imagino que si puedo obtener un ejemplo que funcione, puedo sintonizarlo desde allí en algo que realmente pueda usar. Esto está tomado de otro ejemplo que encontré en la web. No se compila porque la declaración CURSOR es un error de sintaxis de algún tipo.

CREATE PROCEDURE "SCHEMA"."GETRESULTSET (
    IN "p1" VARCHAR(30))
DYNAMIC RESULT SETS 1
BEGIN       
DECLARE CURSOR cur1 WITH RETURN ONLY TO CLIENT FOR 
 SELECT partitioninfo FROM SCHEMA.SessionInfo where username = p1;    
  OPEN cur1;    
END;

De todos modos, seguro que le vendría bien una pista. Vi un ejemplo en el que el CURSOR se declaró por separado del SQL, pero luego no hubo un ejemplo que mostrara cómo introducir la variable en el SQL cuando se declaró como VARCHAR. El ejemplo en el que estoy trabajando era bastante antiguo, pero es lo mejor que pude encontrar.

preguntado el 27 de julio de 12 a las 19:07

1 Respuestas

Una MACRO de Teradata sería una mejor solución para lo que ha descrito.

REPLACE MACRO [MyDB].GetResultSet(p1 VARCHAR(30)) AS (
SELECT "Partition"
  FROM DBC.SessionInfo
 WHERE UserName = :p1;
);

EXEC MyDB.GetResultSet

Si bien un procedimiento almacenado podría usarse para lograr la lógica basada en el cursor de tareas que se usa en otros sistemas de bases de datos populares (Oracle, SQL Server, etc.), puede generar malos hábitos de programación en Teradata. Generalmente, el procesamiento de cursores grandes en Teradata degrada el rendimiento. Muchas cosas para las que ha usado el cursor en otros DBMS son mejores si se hacen con la lógica basada en SET siempre que sea posible.

Dicho esto, los cursores se pueden usar con éxito en Teradata para realizar ciertas tareas que requieren lógica condicional o procesamiento de SQL dinámico. Espero que esto ayude y si tiene un ejemplo más concreto con el que necesita ayuda, estaré encantado de ofrecerle algunas sugerencias.

Edit: Este DDL para su procedimiento funciona contra Teradata 13.10:

CREATE PROCEDURE "SCHEMA"."GETRESULTSET" (
    IN "p1" VARCHAR(30))
DYNAMIC RESULT SETS 1
BEGIN       
DECLARE cur1 CURSOR WITH RETURN ONLY TO CLIENT FOR 
 SELECT "Partition" FROM "SCHEMA".SessionInfo where username = p1;    
  OPEN cur1;    
END;

El nombre del cursor debe preceder a la palabra clave CURSOR. PartitionInfo no es una columna válida en DBC.SessionInfo. No estoy seguro de si "Schema" se reemplaza por MyBatis o no, por lo que es posible que deba modificar la instrucción SELECT.

Respondido 28 Jul 12, 15:07

Uy, mi mal. Debería haber sido más claro acerca de mis objetivos. La idea era crear un procedimiento almacenado que devolviera un conjunto de registros para que luego pudiéramos probar los procedimientos almacenados que devolvieran conjuntos de registros contra MyBatis para una prueba de concepto. Hmmmmm.... Sin embargo, podría ser interesante agregar el caso de prueba. ¿Mybatis puede llamar a una Macro? Buena pregunta. - user447607

¿Grand Rapids, Michigan? Soy originario de Davison, MI. :-)- user447607

:) - Mundo pequeño. Vea mi edición para una versión probada de su procedimiento almacenado que se ejecutó en Teradata 13.10. En mi copia probada, reemplacé "SCHEMA".SessionInfo con "DBC".SessionInfo. - Rob Paller

Sí, también lo había descubierto pero no había tenido tiempo de actualizar el ejemplo. Felicitaciones a usted. :-)- user447607

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.