oracle中已经存在一个存储包,如果改了代码,执行完后,发现存储包的内容没更新
时间: 2024-09-09 10:09:14 浏览: 15
在Oracle数据库中,当你修改了一个存储包(PL/SQL程序包),比如`MY_PKG`中的内容并保存后,立即执行该包,如果没有看到预期的变化,可能是由于以下几个原因:
1. **缓存影响**:Oracle有一个名为`DBMS_METADATA`的工具或包,它会缓存查询结果和某些系统信息,包括存储过程、函数和包。你需要通过`COMPILE PACKAGE`命令强制重新编译存储包,使其从缓存中刷新。
```sql
BEGIN
DBMS_METADATA.COMPILE_PACKAGE ('MY_PKG');
END;
/
```
2. **权限限制**:如果你没有足够的权限去编译存储包,即使你有修改其源码的权限,也无法立即看到更新。确认你是否有合适的`CREATE OR REPLACE PACKAGE`等权限。
3. **事务控制**:如果没有在一个事务中修改并提交存储包,更改可能不会立即生效。确保你在适当的地方(如`BEGIN...END;`块内)进行了修改,并提交事务。
4. **数据字典视图**:检查`ALL_OBJECTS`或其他相关视图,确认包是否已被更新,有时需要等待一段时间,直到所有相关的元数据同步完成。
5. **客户端连接问题**:如果你使用的是共享服务器模式,可能会因为客户端的连接没有刷新新的包版本而看不到更新。重启客户端连接或者切换到一个新的session试试。
为了验证是否真的已更新,请再次运行存储包的相关部分,查看结果是否符合新改动。如果有疑问,也可以通过直接查询源码的方式确认修改是否已经被存储。
相关问题
oracle的pro*c语法 执行存储过程包含入参 接受出参的代码用例
以下是一个包含入参和出参的 Oracle Pro*C 程序的示例:
```
#include <stdio.h>
#include <sqlca.h>
#include <oraca.h>
#include <oci.h>
void Oracle_Connect();
void Oracle_Disconnect();
int main()
{
int in_param = 100;
int out_param;
Oracle_Connect();
/* 定义存储过程调用的 SQL 语句 */
EXEC SQL BEGIN DECLARE SECTION;
int in_param_sql;
int out_param_sql;
EXEC SQL END DECLARE SECTION;
in_param_sql = in_param;
/* 执行存储过程 */
EXEC SQL EXECUTE
BEGIN
my_package.my_procedure(:in_param_sql, :out_param_sql);
END;
out_param = out_param_sql;
printf("输入参数:%d,输出参数:%d\n", in_param, out_param);
Oracle_Disconnect();
return 0;
}
void Oracle_Connect()
{
/* 连接到 Oracle 数据库 */
EXEC SQL CONNECT :user IDENTIFIED BY :password;
}
void Oracle_Disconnect()
{
/* 断开与 Oracle 数据库的连接 */
EXEC SQL COMMIT RELEASE;
}
```
该程序中,定义了一个名为 `my_package.my_procedure` 的存储过程,并在程序中调用了该存储过程。输入参数是一个整数 `in_param`,输出参数是一个整数 `out_param`。在执行存储过程时,需要使用 `EXEC SQL EXECUTE` 语句并使用冒号(:)作为占位符,将变量与存储过程的参数进行绑定。
oracle中,编写一个每日凌晨12点执行存储过程A的job
可以使用Oracle的定时任务工具DBMS_SCHEDULER来实现每日凌晨12点执行存储过程A的任务。以下是实现该任务的步骤:
1. 创建存储过程A
```
CREATE OR REPLACE PROCEDURE A AS
BEGIN
-- 存储过程A的代码
END;
```
2. 创建一个job,并设置其执行时间为每日凌晨12点
```
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'my_job',
job_type => 'STORED_PROCEDURE',
job_action => 'A',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY;BYHOUR=0;BYMINUTE=0;BYSECOND=0',
enabled => TRUE
);
END;
```
3. 启动该job
```
BEGIN
DBMS_SCHEDULER.RUN_JOB('my_job');
END;
```
这样,每天凌晨12点时,存储过程A就会被执行一次。