我想知道是否仍然無法將實際行作為引數傳遞給 oracle 中的函式或程序。我已經根據這個主題看到了一些問題,但還沒有找到對我有好處的答案。我需要做這樣的事情:
function my_func(myrow t%rowtype)AS
BEGIN
END;
因此該函式會將行作為引數。
Select
t.c1,
my_func(t.*) -- where t.* is actual row processed.
from t;
在選擇中,我很想傳遞實際已處理的單行。我希望避免傳遞許多引數,如果我像這樣單獨傳遞它們,就會出現這種情況:
Select
t.c1,
my_func(t.c1,... t.c10)
from t;
我也不想傳遞實際的 id,因為我不想在函式中進行額外的選擇。
uj5u.com熱心網友回復:
如果 Oracle 可以按照您的建議處理行型別,那就太好了。不幸的是,它沒有。查詢中的語法是不允許的,因為 Oracle 的 SQL 不知道 PL/SQL 的行型別。
我建議您改用 rows' ROWID,以便該函式可以立即訪問該行。這與使用行的主鍵(例如 ID)不同,因為 Oracle 不必查找行。有了它,ROWID它已經知道它在哪里。
功能
CREATE OR REPLACE FUNCTION my_func(p_rowid urowid) RETURN INTEGER AS
v_row mytable%ROWTYPE;
BEGIN
SELECT * INTO v_row FROM mytable WHERE rowid = p_rowid;
RETURN v_row.some_column v_row.some_other_column;
END;
查詢
select t.*, my_func(t.rowid)
from mytable t;
uj5u.com熱心網友回復:
我會第二次使用@Thorsten 的建議rowid,但只是為了好玩,您可以通過將整行轉換為 JSON 來解決此限制 - 因為該json_object()函式確實允許t.*作為引數 - 然后從函式中的 JSON 中提取所需的值.
因此,例如,如果您的表格有列c2作為日期并且您想向其中添加 7 天,您可以執行以下操作:
function my_func(myrow json) return date AS
BEGIN
return json_value(myrow, '$.C2' returning date) interval '7' day;
END;
/
然后將其稱為:
select
t.c1,
my_func(cast(json_object(t.*) as json))
from t;
小提琴
與使用重新查詢相比,這看起來并不直觀,而且性能可能更差rowid(因為無論如何資料都會被快取,并且與 JSON 之間的轉換可能會產生更高的開銷)。
不過,兩者似乎都不比將列作為單獨的引數列出更有用。如果表定義發生更改,則函式和呼叫將自動獲取添加/洗掉的列;但是如果該函式需要參考添加的列,或者停止參考已洗掉的列(否則會導致錯誤),則仍需要修改該函式。
uj5u.com熱心網友回復:
該%ROWTYPE語法創建可在 PL/SQL 范圍內(但不能在 SQL 范圍內)使用的 PL/SQL 記錄資料型別。
所以:
Select t.c1,
my_func(t.*) -- where t.* is actual row processed.
from t;
因為 (1) 不支持語法和 (2) 您無法在 SQL 范圍內創建 PL/SQL 記錄型別,所以無法作業。
但是,使用 PL/SQL,如果您宣告該函式:
CREATE FUNCTION my_func(myrow t%rowtype) RETURN NUMBER
IS
BEGIN
DBMS_OUTPUT.PUT_LINE( myrow.id || ', ' || myrow.name );
RETURN 42;
END;
/
然后您可以使用 PL/SQL 塊并回圈遍歷將每一行傳遞給函式的游標:
DECLARE
unused NUMBER;
BEGIN
DBMS_OUTPUT.ENABLE;
FOR i IN (SELECT * FROM t) LOOP
unused := my_func(i);
END LOOP;
END;
/
其中,對于樣本資料:
CREATE TABLE t (id, name) AS
SELECT 1, 'Alice' FROM DUAL UNION ALL
SELECT 2, 'Betty' FROM DUAL UNION ALL
SELECT 3, 'Carol' FROM DUAL UNION ALL
SELECT 4, 'Debra' FROM DUAL;
輸出:
1, Alice 2, Betty 3, Carol 4, Debra
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530921.html
標籤:sql甲骨文plsql
