【问题标题】:Selecting variables without tables in stored procedure在存储过程中选择没有表的变量
【发布时间】:2016-03-02 07:17:29
【问题描述】:

我会将一些输入参数传递给存储过程并在 tem 上进行一些计算。最后我需要检索一些变量。我不会使用数据库中的任何表。

如何使用存储过程只返回变量而不使用Oracle中的任何表?

这是我的代码。

PROCEDURE SP_C3_PSTK_TAKING(
    SCUR                                   IN OUT        CUST_CUR,      
    V_OUTLET                               IN            VARCHAR2,
    V_DATEOF_STOCK_TAKING                  IN            DATE,
    V_PSTK_VALUE                           IN            NUMBER,
    V_PSTK_VALUE_TP_CARDS                  IN            NUMBER,
    V_ACTUAL_STOCK_SHRINKAGE               IN            NUMBER,
    V_NESCAFE_SHRINKAGE                    IN            NUMBER,
    V_ICE_CUBE_SHRINKAGE                   IN            NUMBER,
    V_TURN_OVER_FOR_THE_PERIOD             IN            NUMBER,
    V_TP_CARD_SALES_FOR_THE_PERIOD         IN            NUMBER,
    V_STOCK_TAKE_RECEIVED_DATE             IN            DATE,
    V_STOCK_TAKE_DONE_BY                   IN            VARCHAR2 ,
    )
IS 
    TMPSTRSQL                               CLOB;
    TMPSTRSQL1                              CLOB;
    V_ACTUAL_STOCK_SHRINKAGE_PER            NUMBER;
    V_TOTAL_SHORTAGE                        NUMBER;
    V_T_OVER_EXCLUDING_TEL_CARDS            NUMBER;
    V_SHORTAGEPER                           NUMBER;
    V_ALLOWANCE                             NUMBER;
    V_VARIATION                             NUMBER
    OUTLET                                   VARCHAR(100);
    DATEOF_STOCK_TAKING                      DATE;
    PSTK_VALUE                               NUMBER;
    PSTK_VALUE_TP_CARDS                      NUMBER;
    ACTUAL_STOCK_SHRINKAGE                   NUMBER;
    NESCAFE_SHRINKAGE                        NUMBER;
    ICE_CUBE_SHRINKAGE                       NUMBER;
    TURN_OVER_FOR_THE_PERIOD                 NUMBER;
    TP_CARD_SALES_FOR_THE_PERIOD             NUMBER;
    STOCK_TAKE_RECEIVED_DATE                 DATE;
    STOCK_TAKE_DONE_BY                       VARCHAR(100);




BEGIN
    OUTLET                                  :=    V_OUTLET    ;
    DATEOF_STOCK_TAKING                     :=    V_DATEOF_STOCK_TAKING    ;
    PSTK_VALUE                              :=    V_PSTK_VALUE    ;
    PSTK_VALUE_TP_CARDS                     :=    V_PSTK_VALUE_TP_CARDS    ;
    ACTUAL_STOCK_SHRINKAGE                  :=    V_ACTUAL_STOCK_SHRINKAGE    ;
    NESCAFE_SHRINKAGE                       :=    V_NESCAFE_SHRINKAGE    ;
    ICE_CUBE_SHRINKAGE                      :=    V_ICE_CUBE_SHRINKAGE    ;
    TURN_OVER_FOR_THE_PERIOD                :=    V_TURN_OVER_FOR_THE_PERIOD    ;
    TP_CARD_SALES_FOR_THE_PERIOD            :=    V_TP_CARD_SALES_FOR_THE_PERIOD    ;
    STOCK_TAKE_RECEIVED_DATE                :=    V_STOCK_TAKE_RECEIVED_DATE    ;
    STOCK_TAKE_DONE_BY                      :=    V_STOCK_TAKE_DONE_BY    ;

    V_ACTUAL_STOCK_SHRINKAGE_PER := V_ACTUAL_STOCK_SHRINKAGE + ((V_ACTUAL_STOCK_SHRINKAGE/ 100) * 29 ) ;
    V_TOTAL_SHORTAGE :=    V_ACTUAL_STOCK_SHRINKAGE_PER + V_NESCAFE_SHRINKAGE + V_ICE_CUBE_SHRINKAGE ;
    V_T_OVER_EXCLUDING_TEL_CARDS := V_TURN_OVER_FOR_THE_PERIOD + V_TP_CARD_SALES_FOR_THE_PERIOD ;
    V_SHORTAGEPER := V_TOTAL_SHORTAGE  * 100 / V_T_OVER_EXCLUDING_TEL_CARDS ;
    V_ALLOWANCE := (V_PSTK_VALUE /100 ) * 1 ;      

     TMPSTRSQL := ' ';       


     TMPSTRSQL1 :=    'select V_ACTUAL_STOCK_SHRINKAGE_PER,V_TOTAL_SHORTAGE,V_T_OVER_EXCLUDING_TEL_CARDS,V_SHORTAGEPER,V_ALLOWANCE from dual';

OPEN SCUR FOR TMPSTRSQL1 || TMPSTRSQL;
END    SP_C3_PSTK_TAKING;

【问题讨论】:

  • 嗨 Vijayakumar,欢迎来到堆栈溢出。请提供完整代码的片段,并尝试用文字解释问题。

标签: sql oracle stored-procedures


【解决方案1】:

我会将一些输入参数传递给存储过程,并对其进行一些计算。最后我需要检索一些变量。这里我不会使用数据库中的任何表。

【讨论】:

  • 编辑您的问题以包含更多信息。 StackOverflow 不是论坛。因此,回复帖子旨在提供解决问题的答案。
【解决方案2】:

您的问题在于范围。在动态 SQL 中,我们将字符串传递给引用游标,该字符串必须在数据库引擎的上下文中可运行。换句话说,我们可以在 SQL*Plus 中运行这个查询吗?

 select V_ACTUAL_STOCK_SHRINKAGE_PER,  
        V_TOTAL_SHORTAGE,
        V_T_OVER_EXCLUDING_TEL_CARDS,
        V_SHORTAGEPER,
        V_ALLOWANCE 
from dual

显然不是。 DUAL 只有一列 DUMMY。但是,我们可以从 DUAL 中选择任意数量的文字。

所以你需要做的就是将该字符串转换为文字的投影,如下所示:

 TMPSTRSQL1 := 'select '
               || to_char(v_ACTUAL_STOCK_SHRINKAGE_PER) ||','  
               || to_char(v_TOTAL_SHORTAGE) ||','
               || to_char(v_T_OVER_EXCLUDING_TEL_CARDS) ||','
               || to_char(v_SHORTAGEPER) ||','
               || to_char(v_ALLOWANCE) ||
        ' from dual';

    OPEN SCUR FOR TMPSTRSQL1 || TMPSTRSQL;
END    SP_C3_PSTK_TAKING;

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2013-05-08
    • 2019-11-26
    相关资源
    最近更新 更多