2017-10-18 24 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。我認爲我傾向於一種不同的方式。但我會更新我的代碼以進行澄清。 –