我正在尝试创建一个函数(而不是一个包)来选择当前在我的OP_GUIDE_VIEW中的列数据。
只需要一个能够选择那里的功能。不修改任何东西,不要认为我需要参数或任何东西。到目前为止我得到的是以下内容;但是,我无法弄清楚这个错误来挽救我的生命: - 有错误@ IS C1 V_CURSOR;
我现在拥有的:
create or replace
PACKAGE PKG_OPGUIDE_COLLECTIONDATA AS
type v_cursor is ref cursor
return OPGUIDE_VIEW%rowtype;
c2 v_cursor;
r_c2 c2%rowtype;
function fn_opview return v_cursor
is c1 v_cursor;
begin
open c1 for select * from OPGUIDE_VIEW;
return c1;
end;
begin
c2 := fn_opview;
loop
fetch c2 into r_c2;
exit when c2%notfound;
dbms_output.put_line(initcap(r_c2.JOB_NAME));
end loop;
close c2;
end;
END PKG_OPGUIDE_COLLECTIONDATA;
错误:
PLS-00103: Encountered the symbol "IS" when expecting one of the following:
constant exception <an identifier>
<a double-quoted delimited-identifier> table long double ref
char time timestamp interval date binary national character
nchar
如果需要,可以提供更多信息。
答案 0 :(得分:2)
您正在尝试同时创建包标头和正文。 您必须使用单独的查询创建标题,然后是正文; here你发现了更多的东西。 您可以编辑代码的示例:
设置:
create table OPGUIDE_VIEW(JOB_NAME varchar2(100));
insert into OPGUIDE_VIEW values ('job1');
insert into OPGUIDE_VIEW values ('job2');
包创建:
CREATE OR REPLACE PACKAGE PKG_OPGUIDE_COLLECTIONDATA AS
FUNCTION fn_opview
RETURN SYS_REFCURSOR;
PROCEDURE printData;
END;
/
CREATE OR REPLACE PACKAGE BODY PKG_OPGUIDE_COLLECTIONDATA AS
FUNCTION fn_opview
RETURN SYS_REFCURSOR IS
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT * FROM OPGUIDE_VIEW;
RETURN c1;
END;
PROCEDURE printData IS
c2 SYS_REFCURSOR;
r_c2 OPGUIDE_VIEW%ROWTYPE;
BEGIN
c2 := fn_opview();
LOOP
FETCH c2 INTO r_c2;
EXIT WHEN c2%NOTFOUND;
DBMS_OUTPUT.put_line(INITCAP(r_c2.JOB_NAME));
END LOOP;
CLOSE c2;
END;
END PKG_OPGUIDE_COLLECTIONDATA;
致电您的程序:
SQL> set serveroutput on
SQL>
SQL> begin
2 PKG_OPGUIDE_COLLECTIONDATA.printData;
3 end;
4 /
Job1
Job2
PL/SQL procedure successfully completed.
SQL>