2017-10-18 3 views
0

J'ai un tableau 1 avec des lignes comme les suivantes:Créer Fonction Oracle pour effectuer Nombre total dans les lignes

ID1 ID2 Attempts 
01 01 3 
02 01 2 
03 01 0 
04 01 4 
05 02 1 
06 02 2 

Je dois créer une fonction dans l'oracle qui est passé un ID2 spécifique, et retourner un vrai ou faux selon que le nombre de tentatives à travers les valeurs de ID2 identiques est inférieure à (faux) ou supérieur ou égal (vrai) certains Valeur correspondant à description de: Max Val Tableau 1 en table2:

ID Description  Value 
01 Blah    23 
02 BlahBlah   12 
03 Table1 Max Val 20 

J'ai essayé:

CREATE OR REPLACE FUNCTION greater(Val IN NUMBER) RETURN NUMBER AS 
MAXVAL1 CLOB; 
MAXVAL2 NUMBER; 
BEGIN 
select Value into MAXVAL1 from Table2 Where Description = 'Table1 Max Val'; 
select SUM(Attempts) into MAXVAL2 from Table1 where ID2 = Val; 
4: IF MAXVAL2 < CAST(CAST(MAXVAL AS VARCHAR2(200)) AS NUMBER(10)) 
5:  RETURN 0; 
6: ELSE 
7:  RETURN 1; 
8: END IF; 
9: END; 

cependant, il ne compilera pas (ne pas comme ça coulée).

+0

Où est le type de données de retour de votre fonction? –

+0

également ajouter l'erreur que vous obtenez –

+0

J'ai ajouté le type de retour de la fonction (voir l'article original) –

Répondre

0

Merci pour toute l'assistance. J'ai eu deux problèmes:

  • Création d'une fonction pour effectuer des totaux de comptage sur les lignes
  • Un besoin de convertir une valeur BLOB à un certain nombre

Voici le code qui a fini par travailler pour moi:

CREATE OR REPLACE FUNCTION greater(Val IN NUMBER) RETURN NUMBER 
AS 

MAXVAL1 CLOB; 
MAXVAL2 NUMBER; 
NUM NUMBER; 

BEGIN 

select Value into MAXVAL1 from Table2 Where Description = 'Table1 Max Val'; 
select SUM(Attempts) into MAXVAL2 from Table1 where ID2 = Val GROUP BY ID2; 

NUM := TO_NUMBER(MAXVAL1); 

IF MAXVAL2 < MAXVAL1 THEN 
    RETURN 0; 
ELSE 
    RETURN 1; 
END IF; 
END; 
0

Est-ce que vous avez vraiment besoin le contexte passe dans le PL/SQL en utilisant une fonction et une table de jointure utilisation d'une analyse et de cas vous obtient un 1 ou 0 ...

Case when sum(T1.Attempts) over (partition by T1.ID2) < T2."value" then 0 else 1 end

; 
with Table1 (ID1, ID2, Attempts) as (
SELECT 01, 01, 3 FROM DUAL UNION ALL 
SELECT 02, 01, 2 FROM DUAL UNION ALL 
SELECT 03, 01, 0 FROM DUAL UNION ALL 
SELECT 04, 01, 4 FROM DUAL UNION ALL 
SELECT 05, 02, 1 FROM DUAL UNION ALL 
SELECT 06, 02, 2 FROM DUAL UNION ALL 
SELECT 07, 03, 20 FROM DUAL ), 
Table2 (ID, Description, "value") as (
SELECT 01, 'Blah',    23 FROM DUAL UNION ALL 
SELECT 02, 'BlahBlah',   12 FROM DUAL UNION ALL 
SELECT 03, 'Table1 Max Val', 20 FROM DUAL) 
SELECT Case when sum(T1.Attempts) over (partition by T1.ID2) < T2."value" then 0 else 1 end as MyResult 
FROM Table1 T1 
INNER JOIN table2 T2 
on T1.ID2 = T2.ID 
WHERE T2.Description = 'Blah' 

Passez simplement un paramètre clause where pour ID et limitez les résultats à la colonne myResult.

Mais peut-être que je ne comprends pas le problème.

ou de retourner une seule valeur/disque:

with Table1 (ID1, ID2, Attempts) as (
SELECT 01, 01, 3 FROM DUAL UNION ALL 
SELECT 02, 01, 2 FROM DUAL UNION ALL 
SELECT 03, 01, 0 FROM DUAL UNION ALL 
SELECT 04, 01, 4 FROM DUAL UNION ALL 
SELECT 05, 02, 1 FROM DUAL UNION ALL 
SELECT 06, 02, 2 FROM DUAL UNION ALL 
SELECT 07, 03, 20 FROM DUAL ), 
Table2 (ID, Description, "value") as (
SELECT 01, 'Blah',    23 FROM DUAL UNION ALL 
SELECT 02, 'BlahBlah',   12 FROM DUAL UNION ALL 
SELECT 03, 'Table1 Max Val', 20 FROM DUAL) 
SELECT DISTINCT Case when sum(T1.Attempts) over (partition by T1.ID2) < T2."value" then 0 else 1 end as MyResult 
FROM Table1 T1 
INNER JOIN table2 T2 
on T1.ID2 = T2.ID 
WHERE T2.Description = 'Blah' 
+0

merci xQbert. Je pense que je penche vers une manière différente. mais je vais mettre à jour mon code pour plus de clarté. –