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
作为参数运行。
我做错了什么?
答案 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;
分享并享受。