我是Oracle中的一名新成員。 我想創建一個包含幾個函數的包。 這是我所想要做的軟件包中的臨時表 - Oracle
function FunctionA(UserID, startdate, enddate)
/* Select TransactionDate, Amount
from TableA
where TransactionDate between startdate and enddate
and TableA.UserID = UserID */
Return TransactionDate, Amount
end FunctionA
function FunctionB(UserID, startdate, enddate)
/* Select TransactionDate, Amount
from TableB
where TransactionDate between startdate and enddate
and TableB.UserID = UserID */
Return TransactionDate, Amount
end FunctionA
TYPE TRANSACTION_REC IS RECORD(
TransactionDate DATE,
TransactionAmt NUMBER);
function MainFunction(startdate, enddate)
return TBL
is
vTrans TRANSACTION_REC;
begin
FOR rec IN
(Select UserID, UserName, UserStatus
from UserTable
where EntryDate between startdate and enddate)
LOOP
vTrans := FunctionA(rec.UserID, startdate, enddate)
if vTrans.TransactionDate is null then
vTrans := FunctionB(rec.UserID, startdate, enddate)
if vTrans.TransactionDate is null then
rec.UserStatus := 'Inactive'
endif;
endif;
END Loop;
PIPE ROW(USER_OBJ_TYPE(rec.UserID,
rec.UserName,
rec.UserStatus,
vTrans.TransactionDate,
vTtans.TransactionAmt));
end MainFunction
運行這種代碼的僞代碼需要很長的時間,因爲表A和表B是一個非常大的表,我只得到從表中每條記錄1項。
我想創建一個臨時表(TempTableA,TempTableB)內的臨時存儲所有基於startdate和enddate的記錄,以便當我嘗試檢索每個rec的TransactionDate和金額時,我會只能引用TempTables(小於TableA和TableB)。
我也想考慮如果在TableA和TableB中找不到UserID。所以基本上,當TableA和TableB中沒有找到記錄時,我也希望輸出中有條目,但表示用戶處於非活動狀態。
謝謝你的一切幫助。
爲什麼不優化用於每個表的SQL?如果您只在每個選擇中獲得單行,那麼這意味着您的用戶標識是唯一的。你有這個專欄的(唯一)索引嗎?如果不是,你應該添加一個(或甚至一個主鍵)。基於唯一索引檢索單個行將非常快(並且幾乎與表的大小無關) –
您的其他僞代碼非常垃圾。這是一個不會編譯的東西的大雜燴。如果您希望有人爲您編寫代碼,則應該發佈實際的完整需求,而不是讓人們從輕鬆的PL/SQL中猜測它們。當然,受訪者對你的工作沒有作用,但也許有人會感到特別慷慨。 – APC