2014-03-14 36 views
0
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作为参数运行。 我做错了什么?

+1

第一个问题是,你没有告诉我们你到底有什么问题。如果这是编译错误,您不会向我们展示什么是编译器错误消息。 – user272735

+0

没有任何错误,只是不显示我需要什么。我的函数为单个雇主计算无税的薪水。我需要将这个功能引入这个匿名区块并将其应用于所有雇主。 – redhat01

回答

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; 

正如你已经在光标调用该函数,你就不必再调用它-you'll需要传递正确的参数过(即:使用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; 
+0

谢谢你的回复。逻辑似乎是正确的,但我得到一个错误:PLS-00225:子程序或游标'cursor_name1'引用超出范围。你有什么想法为什么?更正了 – redhat01

+0

- 使用FOR循环时不需要声明 –

+1

不应该使用'DBMS_OUTPUT.PUT_LINE(function_value);'DBMS_OUTPUT.PUT_LINE(vv_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; 
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; 

分享和享受。

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; 

分享并享受。