Pregunta

He visto discusiones acerca de esto en el pasado, como aquí . Pero me pregunto si en algún lugar a lo largo de la línea, tal vez 10g o 11g (estamos utilizando 11 g), Oracle ha introducido ninguna mejor soporte para los "puntos de vista con parámetros", sin necesidad de la basura de la base de datos con toda clase de tipos y definidos por el usuario / o definiciones de cursor o variables SYS_CONTEXT por todas partes.

Estoy esperando tal vez mayor soporte de Oracle para algo que simplemente "simplemente funciona", según el siguiente ejemplo en el T-SQL:

CREATE FUNCTION [dbo].[getSomeData] (@PRODID ROWID)  
RETURNS TABLE AS  
    RETURN SELECT PRODID, A, B, C, D, E  
    FROM MY_TABLE  
    WHERE PRODID = @PRODID

A continuación, sólo seleccionando como así:

SELECT * FROM dbo.getSomeData(23)
¿Fue útil?

Solución

No hay necesidad de SYS_CONTEXT o cursor definiciones. Sí es necesario un tipo de manera que, cuando se analiza el SQL, puede determinar las columnas que van a ser devueltos. Dicho esto, se puede escribir fácilmente un script que va a generar el tipo y tipo de colección definiciones para una o más tablas basadas en los datos en USER_TAB_COLUMNS.

El más cercano es

create table my_table
(prodid number, a varchar2(1), b varchar2(1), 
  c varchar2(1), d varchar2(1), e varchar2(1));

create type my_tab_type is object
(prodid number, a varchar2(1), b varchar2(1), 
  c varchar2(1), d varchar2(1), e varchar2(1))
.
/

create type my_tab_type_coll is table of my_tab_type;
/

create or replace function get_some_data (p_val in number) 
return my_tab_type_coll pipelined is
begin
  FOR i in (select * from my_table where prodid=p_val) loop
    pipe row(my_tab_type(i.prodid,i.a,i.b,i.c,i.d,i.e));
  end loop;
  return;
end;
/

SELECT * FROM table(get_Some_Data(3));

Otros consejos

Es posible definir una especie de "parametrizados" vistas en Oracle. Los pasos son:

  1. Definir un paquete que contiene como miembros públicos que son, de hecho, los parámetros necesarios (no hay necesidad de procedimientos o las funciones de ese paquete),
  2. Definir una vista que se basa en que los miembros del paquete.

Para utilizar este mecanismo un usuario debe:

  1. abrir una sesión,
  2. asignar los valores deseados para que los miembros del paquete,
  3. datos SELECT de la vista,
  4. hacer otras cosas o cerrar la sesión.

NOTA . Es esencial para que el usuario haga todos los tres pasos en una sola sesión como el alcance miembros del embalaje es exactamente una sesión

Existen dos tipos de funciones con valores de tabla en SQL SERVER:

  1. Inline función de valor de tabla: Para una función de valor de tabla en línea, no hay cuerpo de la función; la mesa es el conjunto de resultados de un único estado SELECT. Este tipo puede ser nombrado como 'Vista con parámetros' y que no tiene equivalente en ORACLE que yo sepa.

  2. varias instrucciones con valores de tabla función: Para una función con valores de tabla de instrucciones múltiples, el cuerpo de la función, definida en un bloque BEGIN...END, contiene una serie de instrucciones de Transact-SQL que construyen y se insertan filas en la tabla que será devuelto .

El ejemplo anterior (Por Gary Myers) crea una función de tabla del segundo tipo y que no es una 'vista con parámetros'.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top