Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带游标的plsql函数_Plsql_Oracle11g - Fatal编程技术网

带游标的plsql函数

带游标的plsql函数,plsql,oracle11g,Plsql,Oracle11g,我正在编写一个plsql函数,在这个函数中我想添加一个游标。 游标取决于其中一个表中的值。 如果我在光标之前写任何东西,它会给我错误。 怎么写。 下面是我的示例代码 CREATE OR REPLACE FUNCTION F_ResolveValueExpression(inRowId NUMBER) RETURN VARCHAR2 IS isRangeValue PLS_INTEGER; ExpressionValue VARCHAR2(100);

我正在编写一个plsql函数,在这个函数中我想添加一个游标。 游标取决于其中一个表中的值。 如果我在光标之前写任何东西,它会给我错误。 怎么写。 下面是我的示例代码

CREATE OR REPLACE FUNCTION F_ResolveValueExpression(inRowId NUMBER)
  RETURN VARCHAR2 IS
      isRangeValue     PLS_INTEGER;
      ExpressionValue  VARCHAR2(100);
      FinalRangeValue  VARCHAR2(100);
      g_ExchangeType   VARCHAR2(100) := 'BSE';
      g_TradeMode      VARCHAR2(100) := 'SQUP';
      rangeTypeNrageField        VARCHAR2(10);


      SELECT RANGE_TYPE || ' ' || Range_field
        INTO rangeTypeNrageField
        FROM Range_Header
       WHERE RANGE_ID = inRowId;


      CASE rangeTypeNrageField
        WHEN 'RL EXCHANGE' THEN
            CURSOR c_RangeValueDetails IS
            SELECT R.LOV_VALUE LOV_VALUE,
                   R.RANGE_VAL_TYPE RANGE_VAL_TYPE,
                   R.RANGE_VALUE RANGE_VALUE
              FROM Range_Value_Details R
             WHERE R.RANGE_ID = inRowId
                   AND R.LOV_VALUE = g_ExchangeType;


        WHEN 'RL TRDMODE' THEN
            CURSOR c_RangeValueDetails IS
            SELECT R.LOV_VALUE LOV_VALUE,
                   R.RANGE_VAL_TYPE RANGE_VAL_TYPE,
                   R.RANGE_VALUE RANGE_VALUE
              FROM Range_Value_Details R
             WHERE R.RANGE_ID = inRowId
                   AND R.LOV_VALUE = g_TradeMode;
      END CASE;

        BEGIN

          FOR i IN c_RangeValueDetails 
            LOOP
              IF i.RANGE_VAL_TYPE = 'R' THEN
                  ExpressionValue := F_ResolveValueExpression(i.RANGE_VALUE);
              ELSE
                  ExpressionValue := i.RANGE_VALUE;
              END IF;
            End Loop;

        RETURN FinalRangeValue;
        END;
如果在游标之前输入COMMENT select语句,它将工作。 根据我的案例陈述取决于我的选择。 如何做到这一点。
请帮助。

开始之前,您不能让
选择
案例
;它们不属于申报部分。您可以在其自己的子块中定义每个光标,但随后也必须在每个子块中重复循环代码

不必定义两个游标,您可以通过连接来决定要检查哪一列。类似这样(未经测试):

或者,如果愿意,由于两个原始游标与筛选值不同,因此可以(如您所建议的)分别进行选择,然后将该值传递给参数化游标:

CREATE OR REPLACE FUNCTION F_ResolveValueExpression(inRowId NUMBER)
  RETURN VARCHAR2 IS
      isRangeValue     PLS_INTEGER;
      ExpressionValue  VARCHAR2(100);
      FinalRangeValue  VARCHAR2(100);
      g_ExchangeType   VARCHAR2(100) := 'BSE';
      g_TradeMode      VARCHAR2(100) := 'SQUP';
      rangeTypeNrageField        VARCHAR2(10);

      CURSOR c_RangeValueDetails (c_rangeTypeNrageField varchar2) IS
        SELECT R.LOV_VALUE LOV_VALUE,
               R.RANGE_VAL_TYPE RANGE_VAL_TYPE,
               R.RANGE_VALUE RANGE_VALUE
          FROM Range_Value_Details R
         WHERE R.RANGE_ID = inRowId
           AND R.LOV_VALUE = CASE c_rangeTypeNrageField
                 WHEN 'RL EXCHANGE' THEN g_ExchangeType
                 WHEN 'RL TRDMODE' THEN g_TradeMode END;
BEGIN
    SELECT RANGE_TYPE || ' ' || Range_field
      INTO rangeTypeNrageField
      FROM Range_Header
     WHERE RANGE_ID = inRowId;

     FOR i IN c_RangeValueDetails (rangeTypeNrageField)
...
或者使用以下方法评估先前的案例陈述:

...
      CURSOR c_RangeValueDetails (c_lov_value varchar2) IS
        SELECT R.LOV_VALUE LOV_VALUE,
               R.RANGE_VAL_TYPE RANGE_VAL_TYPE,
               R.RANGE_VALUE RANGE_VALUE
          FROM Range_Value_Details R
         WHERE R.RANGE_ID = inRowId
           AND R.LOV_VALUE = c_lov_value;
BEGIN
    SELECT RANGE_TYPE || ' ' || Range_field
      INTO rangeTypeNrageField
      FROM Range_Header
     WHERE RANGE_ID = inRowId;

     FOR i IN c_RangeValueDetails (CASE rangeTypeNrageField
                 WHEN 'RL EXCHANGE' THEN g_ExchangeType
                 WHEN 'RL TRDMODE' THEN g_TradeMode END)
...

您可以为循环使用隐式游标,而不是显式(在declare部分)游标;感谢您的回复。

谢谢您的回复。。。。。。我不能在开始之前声明游标。。。。然后写我的select语句,然后在case内部为游标赋值。。。。因为上面的代码只是一个小样本。。。我需要从差异表中获取数据。。。所以将不可能在join中写入…@user1515118-是的,我已经用一个例子更新了我的答案。尽管如此,我仍然假设这两个游标除了过滤器值之外是相同的。如果它们实际上根据范围标头数据连接不同的表,那么它会变得更复杂,您可能需要切换到open-fetch-close方法,而不是简单的游标for循环。
...
      CURSOR c_RangeValueDetails (c_lov_value varchar2) IS
        SELECT R.LOV_VALUE LOV_VALUE,
               R.RANGE_VAL_TYPE RANGE_VAL_TYPE,
               R.RANGE_VALUE RANGE_VALUE
          FROM Range_Value_Details R
         WHERE R.RANGE_ID = inRowId
           AND R.LOV_VALUE = c_lov_value;
BEGIN
    SELECT RANGE_TYPE || ' ' || Range_field
      INTO rangeTypeNrageField
      FROM Range_Header
     WHERE RANGE_ID = inRowId;

     FOR i IN c_RangeValueDetails (CASE rangeTypeNrageField
                 WHEN 'RL EXCHANGE' THEN g_ExchangeType
                 WHEN 'RL TRDMODE' THEN g_TradeMode END)
...