Oracle Package 修改后生效问题

jochenshen 2010-08-27 09:53:47
问题:
Oracle Package 在修改后没有生效......

现象:
创建测试包

create or replace package PACK_TEST is
v_global varchar2(1000):='nnnnnnn';

procedure get_values (v_values out varchar2);
procedure set_values (v_values11 in varchar2);
procedure set_values (v_values11 in number);

end PACK_TEST;
/

create or replace package body PACK_TEST is
procedure get_values (
v_values out varchar2
)
as

begin
v_values:=v_global;

end;

procedure set_values (
v_values11 in varchar2
)
as

begin
v_global:=v_values11;
exception
when others then
dbms_output.put_line(sqlcode||':'||sqlerrm);
end;

procedure set_values (
v_values11 in number
)
as

begin
v_global:=v_values11;
exception
when others then
dbms_output.put_line(sqlcode||':'||sqlerrm);
end;
end PACK_TEST;
/

创建测试调用过程:

CREATE OR REPLACE PROCEDURE "PROC_ICE" (
v_A IN VARCHAR2,
v_B IN NUMBER,
v_E IN date,
v_C OUT NUMBER,
v_D OUT VARCHAR2
)
AS
BEGIN
v_c:=0;
pack_test.set_values('kkkkkkkk');
pack_test.get_values(v_d);

exception
when others then
null;
END;
/

在PL/SQL Developer中调用PROC_ICE会打印出v_C=0; v_D=kkkkkkkk; 但修改包后,任意修改,
比如修改 v_global varchar2(1000):='uuuuu';
在PLSQL中(不要重新连接,使用前面已经连接上的SESSION),再次调用PROC_ICE会打印出v_C=0; v_D=; v_D是没有值的,说明过程调用包没有生效,重新连接后是正常的.

在应用中用VC做ODBC连接也是同样的问题, 连接后调用是正常的,但修改包后出现的问题同PL/SQL Developer;
先前以为是ODBC的问题, 所以改用OCI驱动连接, 结果是一样的问题.

但在用SQLPLUS测试的时候是没有问题的,修改包后是立即生效, 打印正常.

个人检查:
包是在第一次调用时将整个包放入内存,我也检查过SHARED_POOL,查看过v$db_object_cache; 使用过dbms_shared_pool包将包重新放入内存,但在PL/SQL Developer和VC中的结果是相同的,问题没有解决.

请教高手这个问题是什么原因??
...全文
635 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jochenshen 2010-09-01
  • 打赏
  • 举报
回复
2楼的朋友,你的视图我是看过的,也试过重新编译,但是问题相同,必须对SESSION重新连接后才可以生效;
有没有方法可以让SESSION不重新连接也可以生效;单独的过程和函数都是可以的,但是包不行;
请回复的朋友测试好方案后再回复.
47522341 2010-08-31
  • 打赏
  • 举报
回复
这个应该是缓冲池中的缓冲机制有问题。
理论上,重新编译package后,package的时间戳会被改变。
已经编译到内存缓冲区中的数据的时间戳由于小于新编译的包的时间戳,内存中的package会失效。
再次调用的时候会重新到磁盘上读取package的内容。

看楼主的意思是vc和plsql的执行,没有重新编译包,这会不会是这两个工具的设置有问题。
心中的彩虹 2010-08-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 jochenshen 的回复:]
问题:
Oracle Package 在修改后没有生效......

现象:
创建测试包

create or replace package PACK_TEST is
v_global varchar2(1000):='nnnnnnn';

procedure get_values (v_values out varchar2);
procedure set……
[/Quote]
--对在sqlplus是马上的刷新的,我觉得还是刷新机制的问题


SQL> create or replace package PACK_TEST is
2 v_global varchar2(1000):='nnnnnnn';
3
4 procedure get_values (v_values out varchar2);
5 procedure set_values (v_values11 in varchar2);
6 procedure set_values (v_values11 in number);
7
8 end PACK_TEST;
9 /

程序包已创建。

SQL> create or replace package body PACK_TEST is
2 procedure get_values (
3 v_values out varchar2
4 )
5 as
6
7 begin
8 v_values:=v_global;
9
10 end;
11
12 procedure set_values (
13 v_values11 in varchar2
14 )
15 as
16
17 begin
18 v_global:=v_values11;
19 exception
20 when others then
21 dbms_output.put_line(sqlcode||':'||sqlerrm);
22 end;
23
24 procedure set_values (
25 v_values11 in number
26 )
27 as
28
29 begin
30 v_global:=v_values11;
31 exception
32 when others then
33 dbms_output.put_line(sqlcode||':'||sqlerrm);
34 end;
35 end PACK_TEST;
36 /

程序包体已创建。


SQL> declare
2 v_c varchar2(100);
3 v_d varchar2(100);
4 begin
5 v_c:='wkc';
6 pack_test.set_values(v_c);
7 pack_test.get_values(v_d);
8 dbms_output.put_line(v_d);
9 end;
10 /

PL/SQL 过程已成功完成。

SQL> set serveroutput on
SQL> /
wkc



SQL> ed
已写入 file afiedt.buf

1 create or replace package PACK_TEST is
2 v_global varchar2(1000):='uuuu';
3 procedure get_values (v_values out varchar2);
4 procedure set_values (v_values11 in varchar2);
5 procedure set_values (v_values11 in number);
6* end PACK_TEST;
7 /

程序包已创建。

SQL>
SQL> declare
2 v_c varchar2(100);
3 v_d varchar2(100);
4 begin
5 pack_test.get_values(v_d);
6 dbms_output.put_line(v_d);
7 end;
8 /
uuuu

PL/SQL 过程已成功完成。






47522341 2010-08-31
  • 打赏
  • 举报
回复
sorry,
刚明白楼主是怎么编译的--你疑似只对package进行了编译是吧。
select * from dba_objects dp
where dp.object_name = 'PACK_TEST'
执行你所谓的修改后,使用上面的脚本检查一下,你会发现你的package body是invalid的

要同时编译package和package body,你的设置自然会生效。
1)rpm格式包安装配置 1.1 下载以rpm后缀名的包,以11.2.0.4.0 版本为例,其中基础包basic、sql*plus、devel包建议默认下载,其他包视情况而定: oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm --基础包,为了运行OCI、OCCI、JDBC-OCI 这几个应用程序; oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm --补充包/文件,是为了运行sql*plus的即时客户端; oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm --补充包/文件,为运行ODBC环境附加库; oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm --补充JDBC下的XA、国际标准、行集操作; oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm --包含头文件和示例文件,为开发Oracle应用程序的即时客户端; 1.2 使用rpm -ivh [包名] 进行安装, 如:rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm 安装的文件默认放在两个位置: 头文件:/usr/include/oracle/11.2/client64/ 下,如果在使用时报错找不到头文件,记得看路径是否是这个。 包文件:/usr/lib/oracle/11.2/client64/ 下,包含{bin、lib}两个文件夹; 1.3 创建文件夹: #mkdir -p /usr/lib/oracle/11.2/client64/network/admin/ 1.4 创建监听文件,并添加内容 #vim /usr/lib/oracle/11.2/client64/network/admin/tnsnames.ora ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = *IP*)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = *SID*) ) ) 1.5 配置环境变量 #vim ~/.bashrc --根目录下为全局使用,为限制用户权限,可只修改某一用户的环境变量 export ORACLE_HOME=/usr/lib/oracle/11.2/client64 export TNS_ADMIN=$ORACLE_HOME/network/admin export NLS_LANG='simplified chinese_china'.ZHS16GBK export LD_LIBRARY_PATH=$ORACLE_HOME/lib export PATH=$ORACLE_HOME/bin:$PATH 1.6 使配置完的环境变量生效 #source ~/.bashrc 1.7 连接数据库测试 #sqlplus /nolog SQL>conn scott/tiger@orcl 2)zip格式包安装配置(只以basic包做为示例) 2.1 下载包:oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.zip 2.2 将包文件解压到指定目录下: #unzip oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.zip 解压后的文件存放路径可以自行设定,但是与后面环境变量设定有关,本文设定/home/orcl/ 下。 头文件目录:/home/orcl/sdk/include/ 库文件目录:/home/orcl/instantclient_11_2/ 2.3 创建 network/admin/ 目录:mkdir -p /home/orcl/instantclient_11_2/network/admin/ 2.4 创建监听文件 tnsnames.ora #vim /home/orcl/instantclient_11_2/network/admin/tnsnames.ora ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.232.131)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) 2.5 配置环境变量 #vim ~/.bashrc export ORACLE_HOME=/home/orcl/instantclient_11_2 export TNS_ADMIN=$ORACLE_HOME/network/adminexport export NLS_LANG='simplified chinese_china'.ZHS16GBKexport export LD_LIBRARY_PATH=$ORACLE_HOME export PATH=$ORACLE_HOME:$PATH 2.6 配置完成后,将环境变量生效 #source ~/.bashrc 2.7 测试连接
1)rpm格式包安装配置 1.1 下载以rpm后缀名的包,以11.2.0.4.0 版本为例,其中基础包basic、sql*plus、devel包建议默认下载,其他包视情况而定: oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm --基础包,为了运行OCI、OCCI、JDBC-OCI 这几个应用程序; oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm --补充包/文件,是为了运行sql*plus 的即时客户端; oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm --补充包/文件,为运行ODBC环境附加库; oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm --补充JDBC下的XA、国际标准、行集操作; oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm --包含头文件和示例文件,为开发Oracle应用程序的即时客户端; 1.2 使用rpm -ivh [包名] 进行安装, 如:rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm 安装的文件默认放在两个位置: 头文件:/usr/include/oracle/11.2/client64/ 下,如果在使用时报错找不到头文件,记得看路径是否是这个。 包文件:/usr/lib/oracle/11.2/client64/ 下,包含{bin、lib}两个文件夹; 1.3 创建文件夹: #mkdir -p /usr/lib/oracle/11.2/client64/network/admin/ 1.4 创建监听文件,并添加内容 #vim /usr/lib/oracle/11.2/client64/network/admin/tnsnames.ora ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = *IP*)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = *SID*) ) ) 1.5 配置环境变量 #vim ~/.bashrc --根目录下为全局使用,为限制用户权限,可只修改某一用户的环境变量 export ORACLE_HOME=/usr/lib/oracle/11.2/client64 export TNS_ADMIN=$ORACLE_HOME/network/admin export NLS_LANG='simplified chinese_china'.ZHS16GBK export LD_LIBRARY_PATH=$ORACLE_HOME/lib export PATH=$ORACLE_HOME/bin:$PATH 1.6 使配置完的环境变量生效 #source ~/.bashrc

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧