问题一:
我有一个view,想在里面添加参数来查询,在网上找到一种方法是用包修改全局变量然后view再去调用全局变量来实现的
以下是创建包的语句,报错pls-00103:Encountered the symbol "create",指向第五行
网上说要在第五行之前加‘/’,加完之后又报错 pls-00103:Encountered the symbol "/",为什么会这样呢?1.CREATE OR REPLACE PACKAGE PKG_REPORT AS
2.  FUNCTION GET_VALUE RETURN VARCHAR2;
3.  PROCEDURE SET_VALUE(PS_TIME IN VARCHAR2);
4.END PKG_REPORT;
5.CREATE OR REPLACE PACKAGE BODY PKG_REPORT IS
6.M_V VARCHAR2(6);
7.PROCEDURE SET_VALUE(PS_TIME IN VARCHAR2) IS BEGIN M_V:=PS_TIME; END;
8.FUNCTION GET_VALUE RETURN VARCHAR2 IS BEGIN RETURN M_V; END;
9.END PKG_REPORT;
问题二:
假设上面的包添加成功了之后
我在查询的时候应该怎么调用这个包去修改全局变量呢?写在查询的sql里面么?应该怎么写
例如有个view A;里面的参数是PKG_REPORT.GET_VALUE()
现在想select * from A,那PKG_REPORT.SET_VALUE('2010')这个语句应该写在哪里?

解决方案 »

  1.   

    第一个问题,像我下面这样写的就OK,分号后回车起新行写个/:
    CREATE OR REPLACE PACKAGE PKG_REPORT AS
      FUNCTION GET_VALUE RETURN VARCHAR2;
      PROCEDURE SET_VALUE(PS_TIME IN VARCHAR2);
    END PKG_REPORT;
    /
    CREATE OR REPLACE PACKAGE BODY PKG_REPORT IS
      M_V VARCHAR2(6);
      PROCEDURE SET_VALUE(PS_TIME IN VARCHAR2) IS
      BEGIN
        M_V := PS_TIME;
      END;
      FUNCTION GET_VALUE RETURN VARCHAR2 IS
      BEGIN
        RETURN M_V;
      END;
    END PKG_REPORT;
    /第二个问题:在执行select * from A之前,先执行:
    exec pkg_report.set_value('2010');
    然后写:select * from A;
    这样就OK了!
      

  2.   

    sql窗口中的话,将包声明和包体分开编译
    begin
    pkg_report.SET_VALUE('B');
    end;
    来设定变量值
    select pkg_report.GET_VALUE from dual;
    来取值。
    需要注意的是这个全局变量的全局仅限当前会话里。