Oracle 使用游标创建函数
Oracle create function using cursors
我需要创建一个函数,在该函数中我必须将查询结果作为输入传递给由 space 连接的输出查询。下面的代码大概写了。在修改函数方面需要帮助。
CREATE or replace FUNCTION GETPGM(Year IN Number, ID IN Number)
RETURN VARCHAR2 IS
result VARCHAR2(200);
cursor getterm is
select term_code from table_term
where proc_yr = Year;
BEGIN
loop
fetch cur into TERM;
exit when cur%NOTFOUND;
select f_getp (ID,:TERM1,Year)||' ' f_getp (ID,:TERM2,Year) from dual -- output Result set
end loop;
RETURN result;
END;
如有任何疑问,请告诉我。
不清楚 TERM1 和 TERM2 是什么(参数?如果是,您应该将它们传递给函数),也不清楚结果应该是什么。
无论如何,看看这样的事情是否有帮助:
CREATE OR REPLACE FUNCTION getpgm (par_year IN NUMBER,
par_id IN NUMBER,
par_term1 IN NUMBER,
par_term2 IN NUMBER)
RETURN VARCHAR2
IS
result VARCHAR2 (200);
BEGIN
FOR cur_r IN (SELECT term_code
FROM table_term
WHERE proc_yr = par_year)
LOOP
result :=
result
|| ' '
|| f_getp (par_id, par_term1, par_year)
|| ' '
|| f_getp (par_id, par_term2, par_year);
END LOOP;
RETURN result;
END;
result
应该与其“先前”值连接(否则,您将得到最后一个游标的值作为结果,而不是 everything)
- 使用游标
FOR
循环,因为 Oracle 会为您完成所有肮脏的工作(您不必声明游标变量,打开游标,从中获取,担心退出循环,关闭游标- 请注意,您的代码中应该没有很多东西)
- 注意return值的数据类型;一个长度为 200 个字符的字符串是否足够?结果将是一些值的 space-separated 列表。您不想 return 引用游标还是集合?
如果要将 f_getp
函数应用于查询结果的每一行并将结果连接成 space 分隔字符串,则不需要使用游标,可以使用 LISTAGG
:
CREATE FUNCTION GETPGM(
i_year IN table_term.proc_yr%type,
i_id IN Number
) RETURN VARCHAR2
IS
result VARCHAR2(200);
BEGIN
SELECT LISTAGG(f_getp(i_id, term_code, i_year), ' ') WITHIN GROUP (ORDER BY term_code)
INTO result
FROM table_term
WHERE proc_yr = i_year;
RETURN result;
END;
/
我需要创建一个函数,在该函数中我必须将查询结果作为输入传递给由 space 连接的输出查询。下面的代码大概写了。在修改函数方面需要帮助。
CREATE or replace FUNCTION GETPGM(Year IN Number, ID IN Number)
RETURN VARCHAR2 IS
result VARCHAR2(200);
cursor getterm is
select term_code from table_term
where proc_yr = Year;
BEGIN
loop
fetch cur into TERM;
exit when cur%NOTFOUND;
select f_getp (ID,:TERM1,Year)||' ' f_getp (ID,:TERM2,Year) from dual -- output Result set
end loop;
RETURN result;
END;
如有任何疑问,请告诉我。
不清楚 TERM1 和 TERM2 是什么(参数?如果是,您应该将它们传递给函数),也不清楚结果应该是什么。
无论如何,看看这样的事情是否有帮助:
CREATE OR REPLACE FUNCTION getpgm (par_year IN NUMBER,
par_id IN NUMBER,
par_term1 IN NUMBER,
par_term2 IN NUMBER)
RETURN VARCHAR2
IS
result VARCHAR2 (200);
BEGIN
FOR cur_r IN (SELECT term_code
FROM table_term
WHERE proc_yr = par_year)
LOOP
result :=
result
|| ' '
|| f_getp (par_id, par_term1, par_year)
|| ' '
|| f_getp (par_id, par_term2, par_year);
END LOOP;
RETURN result;
END;
result
应该与其“先前”值连接(否则,您将得到最后一个游标的值作为结果,而不是 everything)- 使用游标
FOR
循环,因为 Oracle 会为您完成所有肮脏的工作(您不必声明游标变量,打开游标,从中获取,担心退出循环,关闭游标- 请注意,您的代码中应该没有很多东西) - 注意return值的数据类型;一个长度为 200 个字符的字符串是否足够?结果将是一些值的 space-separated 列表。您不想 return 引用游标还是集合?
如果要将 f_getp
函数应用于查询结果的每一行并将结果连接成 space 分隔字符串,则不需要使用游标,可以使用 LISTAGG
:
CREATE FUNCTION GETPGM(
i_year IN table_term.proc_yr%type,
i_id IN Number
) RETURN VARCHAR2
IS
result VARCHAR2(200);
BEGIN
SELECT LISTAGG(f_getp(i_id, term_code, i_year), ' ') WITHIN GROUP (ORDER BY term_code)
INTO result
FROM table_term
WHERE proc_yr = i_year;
RETURN result;
END;
/