Question

Je l'ai vu des discussions à ce sujet dans le passé, comme ici . Mais je me demande si quelque part le long de la ligne, peut-être 10g ou 11g (nous utilisons 11g), ORACLE a mis en place une meilleure prise en charge des « vues paramétrées », sans avoir besoin de litière la base de données avec toutes sortes de types définis par l'utilisateur et / ou des définitions de curseur ou variables sys_context partout.

J'espère peut-être le meilleur soutien de quelque chose qui ORACLE simplement « fonctionne », comme dans l'exemple suivant dans 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

Ensuite, il suffit sélectionner comme ceci:

SELECT * FROM dbo.getSomeData(23)
Était-ce utile?

La solution

Pas besoin de définitions de SYS_CONTEXT ou curseur. Vous avez besoin d'un type de sorte que, lorsque le SQL est analysé, il peut déterminer quelles colonnes vont être retournées. Cela dit, vous pouvez facilement écrire un script qui va générer des définitions de type et le type de collection pour une ou plusieurs tables sur la base des données user_tab_columns.

Le plus proche est

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));

Autres conseils

Il est possible de définir une sorte de « paramétrées » vues dans Oracle. Les étapes sont les suivantes:

  1. Définir un paquet contenant en tant que membres du public qui sont en fait les paramètres nécessaires (il n'y a pas besoin de fonctions ou de procédures dans ce paquet),
  2. Définir une vue basée sur que les membres du paquet.

Pour utiliser ce mécanisme un utilisateur doit:

  1. ouvrir une session,
  2. attribuer les valeurs de consigne pour que les membres de paquets,
  3. données SELECT de la vue,
  4. faire d'autres choses ou fermer la session.

REMARK :. Il est essentiel pour l'utilisateur de faire toutes les trois étapes en une seule session en tant que membres du package champ d'application est exactement une session

Il existe deux types de fonctions table dans SQL Server:

  1. Tableau inline Fonction: Pour une fonction de table inline, il n'y a pas de corps de fonction; la table est le résultat d'une seule mis déclaration de SELECT. Ce type peut être nommé « Vue paramétrées » et il n'a pas d'équivalent dans ORACLE que je sache.

  2. table valeur instruction multiple fonction: Pour une fonction de table d'une valeur plusieurs instructions, le corps de la fonction, définie dans un bloc BEGIN...END, contient une série d'instructions Transact-SQL qui construisent et insérer des lignes dans la table qui sera retournée .

L'exemple ci-dessus (par Gary Myers) crée une fonction de table du second type et il n'est pas une 'vue paramétrés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top