前两天帮朋友,看一段代码。就是在过程中动态的创建一个表,然后在插入一些数据。整个过程就是自己在学习存储过程做测试用的。不过,就这一段简单的代码让我卡了两天的时间。以下是出错代码:
create or replace procedure p_insert_date(date1 varchar2) as
date2 date;
v_sql varchar2(200); --定义变量
begin
execute immediate 'truncate table test_date'; --删除表
v_sql:='create table '||'test_date'||' ('||
'v1 varchar2(15),'||
'v2 varchar2(15),'||
'v3 varchar2(15),'||
'v4 varchar2(15),'||
'v5 varchar2(15),'||
'v6 varchar2(15),'||
'v7 varchar2(15),'||
'v8 varchar2(15),'||
'v9 varchar2(15)'||' )';
execute immediate v_sql; --动态建表
date2 := to_date(date1, 'yyyymmdd');
while date2 < to_date(20080117, 'yyyymmdd') loop
insert into test_date
values
(to_char(date2, 'yyyy') || '年' || to_char(date2, 'mm') || '月' || to_char(date2, 'dd') || '日',
to_char(date2, 'yyyymm'),
to_char(date2, 'mm'),
to_char(date2, 'q'), --v4
to_char(date2, 'ww'), --v5
to_char(date2, 'd'), --v6
(case
when to_char(date2, 'd') not in ('6', '7') then
'0'
else
'1'
end), --v7
to_char(add_months(date2, -1), 'yyyymm'),
to_char(date2, 'yyyymm') || to_char(last_day(date2), 'dd'));
date2 := date2 + 1;
end loop;
commit;
end p_insert_date;
一直报错,最后加了个
AUTH_ID CURRENT_USER 才给解决掉。
查文档发现用户拥有的role权限不能在存储过程中使用。有两个解决办法:
一,显示授予系统权限
上面可显示授予权限,如grant create table to user; 来解决;
二,在创建procedure时,加上Authid Current_User关键字来使用role权限.
一,显示授予系统权限
上面可显示授予权限,如grant create table to user; 来解决;
二,在创建procedure时,加上Authid Current_User关键字来使用role权限.
最后搜了一些这方面的资料 学习一下!
AUTH_ID CURRENT_USER|DEFINER
涉及到多模式设计下,程序的调用者权限VS执行者权限的问题。
1. 调用者权限(AUTH_ID CURRENT_USER)的优点
调用者权限的子程序能让我们重用代码并将程序逻辑集中化。它们对于那些在不同的模式中存储数据的应用程序来说特别有用。这种情况下,多个用户可以使用一份代码来管理他们的数据。
假设有一个使用定义者权限(DR)的过程analyze用于分析公司的销售情况。为了提供本地销售的汇总信息,过程分析必须访问每个地区的sales表。所以,如下表所示,过程必须放在每一个地区的站点中。这就会引起一个关于维护的问题。
要解决这个问题,公司就得在总部设置一个调用者权限的过程analyze。现在,如下图所示,所有地区的站点都可以使用同一个过程来查询它们自己的sales表了。
如果要严格限定对敏感数据的访问,我们可以使用调用者权限的子程序来调用定义者权限子程序。假设总部要用过程analyze来计算销售佣金并更新payroll表。
问题是analyze的当前用户并不能直接访问存储了雇员工资和其他敏感数据的payroll表。如下图所示,解决方法就是用过程analyze调用定义者权限的calc_comm过程,变相地更新payroll表。
2. 执行当前子程序的用户是谁--CURRENT_USER|DEFINER相互调用的问题.
在一系列调用中,如果一个调用者权限的子程序是第一个被调用的子程序,那么当前用户就是会话用户。这样的状态会一直保持到一个定义者权限子程序被调用,这时,定义者权限的所有者就成了当前用户。如果定义者权限的子程序调用了调用者权限的子程序,它们就会按定义者权限来执行。当定义者权限的子程序退出时,控制权又回重新归还给原先的当前用户。
来源: http://blog.csdn.net/rcom10002/archive/2007/09/02/1769443.aspx
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26622598/viewspace-717396/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26622598/viewspace-717396/