2015-02-09 42 views
-1

我创建了以下存储过程:查看临时表从内部存储过程在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”来查看存储过程执行时的结果,但是在这里我应该如何处理全局临时表,以便在执行存储过程时获得表内记录?

+0

做一个“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

+0

TPI_Data是临时表,一旦会话断开行从其中删除。如果我在执行“select * from TPI_Data”之前不再执行存储过程,我将得到空表。你能帮忙吗? – 2015-02-09 14:01:16

+0

无论何时调用此程序,仍处于同一会话中。你是否用ON COMMIT PRESERVE创建表格?或ON COMMIT DELETE?如果你使用前者,它会很好..同一届,不用担心。如果你做了后者,你可能会考虑从程序中删除提交(有些人会认为程序内部的COMMIT是不好的做法 - 我不打算在这里争论,但是如果你使用了它,可能会更好ON COMMIT DELETE);) – Ditto 2015-02-09 14:05:33

回答

1

使用Oracle时,应该忘记MSSQL。他们的方法完全不同。如果您希望从存储过程返回一些表格数据,则通常应使用输出REF CURSOR参数。如果你只想调试你的数据,那么在调用SP之后简单地做SELECT。

坏消息,在12c甲骨文实现了MSSQL-like facility缓解ms开发人员的痛苦。

+0

然后再从前端我必须声明一个ref_cursor类型的变量,然后执行存储过程是吗?我试图避免在执行时声明任何进一步的变量,只是一个执行过程语句,有没有解决方案? – 2015-02-09 13:58:57

+0

Sormita,如果你有一个工具,你应该明白这是首选的方法。现在,你看起来像一个骑自行车的人买了一辆劳斯莱斯,现在试图用两个车轮来驾驶它。从前端....也许你根本不需要SP,只需要从这个客户端的一个SELECT。但是,如果您需要从SP返回结果集,则应该使用引用游标。在服务器端,您应该将sys_refcursor参数描述到您的SP中。在客户端,它依赖于DAC。 Google为您的客户端库提供游标示例。 – 2015-02-09 14:20:15

0

过程完成后,您可以查询表格。如果您看到零行,这可能是因为临时表是用ON COMMIT DELETE ROWS(这是默认值)而不是ON COMMIT PRESERVE ROWS来声明的。

http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_7002.htm#i2189569

如果你想查看从UI的结果,你要么返回一个引用光标或使用常规表,使数据仍然存在。在全局临时表中,一旦会话关闭,数据就会消失。

+0

这就是我想要的数据,我插入临时表中的数据已经存在于其他两个表中,我不想用相同的数据创建另一个表。 – 2015-02-09 14:03:22

+0

在这种情况下,返回引用光标是正确的方法。即使名称GetTPICostCenters排序也指示该过程/函数以引用游标的形式返回结果集。 (至少这是我在Oracle数据库上下文中理解它的方式) – 2015-02-09 14:07:24