2017-10-18 58 views
0

我有像行的表1以下:创建Oracle函数来执行总计数跨行

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

我需要创建传递特定ID2 Oracle中的功能,并返回一个true或false取决于的尝试跨越相同ID2值数量是否大于小于(假)或大于或等于(真)一些对应于描述表1最大的Val在表2:

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

我曾尝试:

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; 

但是,它不会编译(不喜欢那个铸造)。

+0

其中是函数的返回数据类型? –

+0

也添加你得到的错误 –

+0

我添加了函数的返回类型(看原帖) –

回答

0

感谢所有帮助。我有两个问题:

  • 创建一个函数,跨行执行数总计
  • 一个需要一个BLOB值转换为数字

这里是最终为我工作的代码:

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

你真的需要使用功能的表连接,并使用分析的在PL/SQL的上下文切换和案例让你一个1或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' 

简单地通过一个where子句参数的ID和限制结果成为myResult列..

但也许我不明白这个问题。

,或者返回一个值/记录:

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

谢谢xQbert。我认为我倾向于一种不同的方式。但我会更新我的代码以进行澄清。 –