我創建了以下存儲過程:查看臨時表從內部存儲過程在Oracle
CREATE OR REPLACE PROCEDURE GetTPICostCenters
IS
varCost_Center VARCHAR2(10);
varPI_MAX_DATE DATE;
varFD_MAX_DATE DATE;
BEGIN
--OPEN costcenter_WFDB;
FOR item IN (select distinct(cost_center) as cost_center from fd_cost_center_validation where cost_center in
(select distinct(cost_center) from pi_cost_center_validation))
LOOP
--FETCH costcenter_WFDB INTO varCost_Center;
SELECT GREATEST(nvl(CC_APPROVE_DATE,DATE '0001-01-01') ,nvl(CC_CHANGE_DATE,DATE '0001-01-01') ,nvl(CC_TAX_VALIDATE_DATE,DATE '0001-01-01'),nvl(COST_POOL_DETER_DATE,DATE '0001-01-01') ,nvl(DESC_UPDATE_DATE,DATE '0001-01-01'),
nvl(PRICING_METHOD_UPD_DATE,DATE '0001-01-01') ,nvl(INTER_861_LAST_MODIFY_DATE,DATE '0001-01-01')) INTO varPI_MAX_DATE
FROM pi_cost_center_validation WHERE COST_CENTER=item.cost_center;
SELECT GREATEST(nvl(CC_APPROVE_DATE,DATE '0001-01-01') ,nvl(CC_CHANGE_DATE,DATE '0001-01-01') ,nvl(CC_TAX_VALIDATE_DATE,DATE '0001-01-01'),nvl(COST_POOL_DETER_DATE,DATE '0001-01-01') ,nvl(DESC_UPDATE_DATE,DATE '0001-01-01'),
nvl(PRICING_METHOD_UPD_DATE,DATE '0001-01-01') ,nvl(INTER_861_LAST_MODIFY_DATE,DATE '0001-01-01')) INTO varFD_MAX_DATE
FROM fd_cost_center_validation WHERE S_ROWID IN
(SELECT S_ROWID FROM FD_COST_CENTER_VALIDATION FD GROUP BY COST_CENTER, S_ROWID
HAVING S_ROWID = (SELECT MAX(S_ROWID) FROM FD_COST_CENTER_VALIDATION WHERE COST_CENTER=FD.COST_CENTER))
AND COST_CENTER=item.cost_center;
IF (varPI_MAX_DATE>varFD_MAX_DATE) THEN
INSERT INTO TPI_Data
(COST_CENTER,COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER,SUB_COST_POLL_SHORT_DESC,DRIVER,
DRIVER_PER,MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,COST_POOL_B_PER,COST_SUB_POOL_B,
DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,MARKUP_BASE_2,PRICING_2,COST_POOL_C,COST_POOL_C_PER,
COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,MARKUP_BASE_3,PRICING_3,COST_POOL_D,
COST_POOL_D_PER,COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,MARKUP_BASE_4,
PRICING_4,COST_POOL_E,COST_POOL_E_PER,COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5,
MARKUP_BASE_5,PRICING_5
)
SELECT COST_CENTER, COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER,
SUB_COST_POLL_SHORT_DESC
,DRIVER,DRIVER_PER,
MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,COST_POOL_B_PER,COST_SUB_POOL_B,DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,
MARKUP_BASE_2,PRICING_2,
COST_POOL_C,COST_POOL_C_PER,COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,
MARKUP_BASE_3,PRICING_3,
COST_POOL_D,COST_POOL_D_PER,COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,
MARKUP_BASE_4,PRICING_4,
COST_POOL_E,COST_POOL_E_PER,COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5,
MARKUP_BASE_5,PRICING_5 FROM pi_cost_center_validation WHERE COST_CENTER=item.cost_center;
ELSE
INSERT INTO TPI_Data
(COST_CENTER,COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER,SUB_COST_POLL_SHORT_DESC,DRIVER,
DRIVER_PER,MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,COST_POOL_B_PER,COST_SUB_POOL_B,
DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,MARKUP_BASE_2,PRICING_2,COST_POOL_C,COST_POOL_C_PER,
COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,MARKUP_BASE_3,PRICING_3,COST_POOL_D,
COST_POOL_D_PER,COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,MARKUP_BASE_4,
PRICING_4,COST_POOL_E,COST_POOL_E_PER,COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5,
MARKUP_BASE_5,PRICING_5
)
SELECT COST_CENTER, COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER,
SUB_COST_POLL_SHORT_DESC,DRIVER,DRIVER_PER,MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,
COST_POOL_B_PER,COST_SUB_POOL_B,DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,MARKUP_BASE_2,PRICING_2,
COST_POOL_C,COST_POOL_C_PER,COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,MARKUP_BASE_3,PRICING_3,
COST_POOL_D,COST_POOL_D_PER,COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,MARKUP_BASE_4,PRICING_4,
COST_POOL_E,COST_POOL_E_PER,COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5,MARKUP_BASE_5,PRICING_5
FROM FD_COST_CENTER_VALIDATION WHERE S_ROWID IN
(SELECT S_ROWID FROM FD_COST_CENTER_VALIDATION FD GROUP BY COST_CENTER, S_ROWID
HAVING S_ROWID = (SELECT MAX(S_ROWID) FROM FD_COST_CENTER_VALIDATION WHERE COST_CENTER=FD.COST_CENTER))
AND COST_CENTER=item.cost_center;
END IF;
END LOOP;
--CLOSE costcenter_WFDB;
INSERT INTO TPI_Data
(COST_CENTER,COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER,SUB_COST_POLL_SHORT_DESC,DRIVER,
DRIVER_PER,MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,COST_POOL_B_PER,COST_SUB_POOL_B,
DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,MARKUP_BASE_2,PRICING_2,COST_POOL_C,COST_POOL_C_PER,
COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,MARKUP_BASE_3,PRICING_3,COST_POOL_D,
COST_POOL_D_PER,COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,MARKUP_BASE_4,
PRICING_4,COST_POOL_E,COST_POOL_E_PER,COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5,
MARKUP_BASE_5,PRICING_5
)
SELECT COST_CENTER, COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER,
SUB_COST_POLL_SHORT_DESC,DRIVER,DRIVER_PER,MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,COST_POOL_B_PER,
COST_SUB_POOL_B,DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,MARKUP_BASE_2,PRICING_2,COST_POOL_C,COST_POOL_C_PER,
COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,MARKUP_BASE_3,PRICING_3,COST_POOL_D,COST_POOL_D_PER,
COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,MARKUP_BASE_4,PRICING_4,COST_POOL_E,COST_POOL_E_PER,
COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5,MARKUP_BASE_5,PRICING_5 FROM FD_COST_CENTER_VALIDATION
WHERE S_ROWID IN
(SELECT S_ROWID FROM FD_COST_CENTER_VALIDATION FD GROUP BY COST_CENTER, S_ROWID
HAVING S_ROWID = (SELECT MAX(S_ROWID) FROM FD_COST_CENTER_VALIDATION WHERE COST_CENTER=FD.COST_CENTER))
AND COST_CENTER NOT IN (SELECT COST_CENTER FROM TPI_Data);
COMMIT;
END;
在上面的存儲過程TPI_Deata是在過程中得到填充全局臨時表。在sql server中,我們曾經在存儲過程中執行「select * from temp_table」來查看存儲過程執行時的結果,但是在這裏我應該如何處理全局臨時表,以便在執行存儲過程時獲得表內記錄?
做一個「select * from TPI_Data;」 ..不要在程序中做。從所謂的程序做起。或者,您可以讓程序返回REF Cursor .. http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#BABIIGAG – Ditto 2015-02-09 13:56:44
TPI_Data是臨時表,一旦會話斷開行從其中刪除。如果我在執行「select * from TPI_Data」之前不再執行存儲過程,我將得到空表。你能幫忙嗎? – 2015-02-09 14:01:16
無論何時調用此程序,仍處於同一會話中。你是否用ON COMMIT PRESERVE創建表格?或ON COMMIT DELETE?如果你使用前者,它會很好..同一屆,不用擔心。如果你做了後者,你可能會考慮從程序中刪除提交(有些人會認爲程序內部的COMMIT是不好的做法 - 我不打算在這裏爭論,但是如果你使用了它,可能會更好ON COMMIT DELETE);) – Ditto 2015-02-09 14:05:33