我创建了以下存储过程:查看临时表从内部存储过程在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