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