匿名块中的调用函数

时间:2014-03-14 04:31:06

标签: sql plsql

DECLARE
  vv_1 emp.id%TYPE;
  CURSOR cursor_name IS 
    SELECT id, function_name(vv_1) 
      FROM emp;
  cursor_name1 cursor_name%rowtype;
BEGIN
  FOR cursor_name1 IN cursor_name
  LOOP
    DBMS_OUTPUT.PUT_LINE(function(vv_1));
  END LOOP;
END; 

我的职能function_name正在计算某种薪水税。 在这个匿名区块中,我需要调用该函数并用它来计算所有雇主的工资。

function_name()设置为使用雇主的id作为参数运行。 我做错了什么?

4 个答案:

答案 0 :(得分:1)

我认为你没有为你用作参数的vv_1变量赋值。在调用函数之前,需要为vv_1变量赋值:

DECLARE
  vv_1 emp.id%TYPE;
  CURSOR cursor_name IS 
    SELECT id, function_name(vv_1)
    FROM emp;
  cursor_name1 cursor_name%rowtype;
BEGIN
  FOR cursor_name1 IN cursor_name
  LOOP
    vv_1 := cursor_name1.id;
    DBMS_OUTPUT.PUT_LINE(function_name(vv_1));
  END LOOP;
END;

由于您已经在光标中调用该函数,因此您不必再次调用它 - 您也需要传递正确的参数(即:使用id字段):

DECLARE
  vv_1 emp.id%TYPE;
  CURSOR cursor_name IS 
    SELECT id, function_name(id) function_value
    FROM emp;
BEGIN
  FOR cursor_name1 IN cursor_name
  LOOP
    DBMS_OUTPUT.PUT_LINE(cursor_name1.function_value);
  END LOOP;
END;

答案 1 :(得分:1)

在SQL语句(光标)中,选择function_name(vv_1)。您应该给它一个别名,以便在迭代游标时更容易引用计算值。我选择了func_value,但它取决于您最能描述其功能的内容:

CURSOR cursor_name IS 
  SELECT id, 
         function_name(vv_1) func_value
    FROM emp;

然后,在迭代中,您可以使用cursor_name1.func_value

来引用它
FOR cursor_name1 IN cursor_name
LOOP
  DBMS_OUTPUT.PUT_LINE(cursor_name1.func_value);
END; 

答案 2 :(得分:0)

使用SQL语句FOR循环:

可以使这更简单
BEGIN
  FOR aRow IN (SELECT function_name(id) AS FUNCTION_VALUE FROM emp) LOOP
    DBMS_OUTPUT.PUT_LINE(aRow.FUNCTION_VALUE);
  END LOOP;
END;

以这种方式完成对DECLARE块的需求消失,因为不需要声明任何变量。

如果首选从循环内部调用该函数,例如,如果function_name是一个打包的函数,而该函数未被软件包规范公开,那么您可能需要这样做可以将其重写为

BEGIN
  FOR aRow IN (SELECT ID FROM emp) LOOP
    DBMS_OUTPUT.PUT_LINE(function_name(aRow.ID));
  END LOOP;
END;

分享并享受。

答案 3 :(得分:0)

使用SQL语句FOR循环:

可以使这更简单
BEGIN
  FOR aRow IN (SELECT function_name(id) AS FUNCTION_VALUE FROM emp) LOOP
    DBMS_OUTPUT.PUT_LINE(aRow.FUNCTION_VALUE);
  END LOOP;
END;

以这种方式完成对DECLARE块的需求消失,因为不需要声明任何变量。

如果首选调用循环内部的函数,如果function_name是一个打包的函数,而这个函数没有被软件包规范公开,那么你可能需要将其重写为< / p>

BEGIN
  FOR aRow IN (SELECT ID FROM emp) LOOP
    DBMS_OUTPUT.PUT_LINE(function_name(aRow.ID));
  END LOOP;
END;

分享并享受。