我正在嘗試在 oracle 中撰寫一個表值函式,其中包含一個 CTE。我已經能夠以這種方式在 SQL Server 中做到這一點:
ALTER FUNCTION [dbo].[region_parents]
(
@regionId INT
)
RETURNS TABLE
AS
RETURN
(
WITH cte AS
(
SELECT id, owner_region_id FROM regions WHERE id = @regionId
UNION ALL
SELECT r.id, r.owner_region_id
FROM cte INNER JOIN
regions r ON cte.owner_region_id = r.id
)
SELECT id
FROM cte
)
這是在交叉應用中呼叫它所必需的:
SELECT *
FROM shops s
...
...
...
INNER JOIN locations l ON s.location_id = l.id
LEFT JOIN location_criteria lc ON lc.location_id = l.id
CROSS APPLY region_parents(l.region_id) r
在 Oracle 中,我嘗試使用用戶定義的資料型別以這種方式進行:
CREATE OR REPLACE TYPE TABLE_RES_OBJ AS OBJECT (
id NUMBER
);
CREATE OR REPLACE TYPE TABLE_RES AS TABLE OF TABLE_RES_OBJ;
CREATE OR REPLACE FUNCTION region_parents (regionId IN INTEGER)
RETURN TABLE_RES
IS
cteresult TABLE_RES;
BEGIN
WITH cte(id, owner_region_id) AS
(
SELECT id AS id, owner_region_id AS owner_region_id FROM regions WHERE id = regionId
UNION ALL
SELECT r.id, r.owner_region_id
FROM cte INNER JOIN
regions r ON cte.owner_region_id = r.id
)
SELECT TABLE_RES(id)
BULK COLLECT INTO cteresult
FROM cte;
RETURN cteresult;
END;
/
問題是我收到以下錯誤:
PL/SQL: ORA-00932: 資料型別不一致:預期的 UDT 得到 NUMBER
我也嘗試過以這種方式實作它,但沒有成功。
uj5u.com熱心網友回復:
似乎是一個簡單的干擾:“SELECT TABLE_RES(id)”應該是“SELECT TABLE_RES_OBJ(id)”。
uj5u.com熱心網友回復:
這與 CTE 無關。您正在嘗試選擇一個表物件,而不是作為該表中元素/行的簡單物件。這個:
SELECT TABLE_RES(id)
BULK COLLECT INTO cteresult
FROM cte;
應該:
SELECT TABLE_RES_OBJ(id)
BULK COLLECT INTO cteresult
FROM cte;
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/533365.html
