CREATE OR REPLACE FUNCTION fLl_02 RETURN sys_refcursor IS p_cursor sys_refcursor; BEGIN OPEN p_cursor FOR SELECT * FROM B_AREAS; RETURN p_cursor; END fLl_02; CREATE OR REPLACE FUNCTION fLl_03(p_cursor sys_refcursor) RETURN VARCHAR2 IS v_row B_AREAS%ROWTYPE; v_str VARCHAR2(200); BEGIN
LOOP FETCH p_cursor INTO v_row; EXIT WHEN p_cursor %NOTFOUND; --DBMS_OUTPUT.PUT_LINE(v_row.area_id); v_str:=v_str||v_row.area_id; END LOOP; RETURN v_str; END fLl_03
--调用例子DECLARE RetVal VARCHAR2(200); P_CURSOR sys_refcursor;BEGIN -- P_CURSOR := NULL; Modify the code to initialize this parameter RetVal := FLL_03 ( FLL_02 ); DBMS_OUTPUT.PUT_LINE(RetVal); COMMIT; END;
lz测试时要相应的修改 OPEN p_cursor FOR SELECT * FROM B_AREAS; --改为你系统中的表名 v_row B_AREAS%ROWTYPE; --改为你系统中的表名 v_str:=v_str||v_row.area_id; --改为你系统中的字段名
非常感谢你,请问不用pl/sql只用sql可不可以??
SELECT FLL_03(FLL_02) FROM dual --测试了一下,如果直接这样用,报FLL_03中游标错误
p_cursor sys_refcursor;
BEGIN
OPEN p_cursor FOR
SELECT * FROM B_AREAS;
RETURN p_cursor;
END fLl_02;
CREATE OR REPLACE FUNCTION fLl_03(p_cursor sys_refcursor) RETURN VARCHAR2
IS
v_row B_AREAS%ROWTYPE;
v_str VARCHAR2(200);
BEGIN
LOOP
FETCH p_cursor INTO v_row;
EXIT WHEN p_cursor %NOTFOUND;
--DBMS_OUTPUT.PUT_LINE(v_row.area_id);
v_str:=v_str||v_row.area_id;
END LOOP;
RETURN v_str;
END fLl_03
RetVal VARCHAR2(200);
P_CURSOR sys_refcursor;BEGIN
-- P_CURSOR := NULL; Modify the code to initialize this parameter RetVal := FLL_03 ( FLL_02 );
DBMS_OUTPUT.PUT_LINE(RetVal);
COMMIT;
END;
OPEN p_cursor FOR
SELECT * FROM B_AREAS; --改为你系统中的表名
v_row B_AREAS%ROWTYPE; --改为你系统中的表名
v_str:=v_str||v_row.area_id; --改为你系统中的字段名
--测试了一下,如果直接这样用,报FLL_03中游标错误