我試圖了解如何從涉及使用 DBI 的游標 FOR LOOP 的 SQL 查詢中回傳計算值。例如,我使用加載到 Oracle 資料庫 (v19c)中的mtcars資料集。它看起來像這樣:
head(DBI::dbGetQuery(con, "SELECT * FROM TEST.MTCARS"))
# MANUFACTURER MPG CYL DISP HP DRAT WT QSEC VS AM GEAR CARB
# 1 Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
# 2 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
# 3 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
# 4 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
# 5 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
# 6 Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
現在,作為一個例子,假設我想迭代地求和 MPG。我意識到我可以簡單地使用SUM函式而不是回圈,但是這里的求和程序是另一個函式的占位符,所以為了一個簡單的例子,請幽默!
下面,我宣告了我的運行總計變數bar,然后回圈遍歷 MTCARS 表的 MPG 列,將每個 MPG 值添加到運行總計中。當回圈結束時,我有一個我想回傳的總數,但我不知道該怎么做。RETURN似乎只回傳整數,所以在這里沒有任何意義。
tmp <- DBI::dbGetQuery(con,
"DECLARE
bar NUMBER:=0;
BEGIN
FOR foo IN (SELECT MPG FROM TEST.MTCARS)
LOOP
bar := bar foo.MPG;
END LOOP;
DBMS_OUTPUT.PUT_LINE(bar);
END;")
tmp
#[1] TRUE
我應該如何從上述計算中回傳一個值?對于這個例子,我希望得到值 642.9,但我得到了 TRUE。
uj5u.com熱心網友回復:
就像我在評論中說的那樣,這是一種方法(我的例子是 scott@hr):
create or replace type sum_type is table of number;
create or replace function your_sum_fun
return sum_type PIPELINED is
v_sum number:=0;
begin
for i in (SELECT salary FROM employees)loop
v_sum:=v_sum i.salary;
end loop;
pipe row (v_sum);
RETURN;
end;
select * from table(your_sum_fun);
或者
create or replace function your_sum_fun
return sum_type PIPELINED is
v_sum number:=0;
begin
select sum(salary) into v_sum from employees;
pipe row (v_sum);
RETURN;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472533.html
