最近,项目需要通过调用存储过程初始化数据库,根据用户名创建该用户下的所有表的视图但是因为在项目中,视图是通过execute immediate 字符串 实现的,所以想,那么函数的创建是否也可以使用这种方式呢:说干就干,最后还真成功了
代码如下
CREATE OR REPLACE PROCEDURE CREATEVIEWSBYUSER(uname in varchar2)
AS
CURSOR table_cur IS
SELECT table_name FROM all_tables where owner=uname;
v_viewsql varchar2(2000);
v_f1sql varchar2(200);
v_f2sql varchar2(200);
BEGIN
FOR table_record IN table_cur LOOP
--create or replace view 'view2_'||table_record.table_name as select * from table_record.table_name;
--create or replace view a_减员 as select * from gx.a_减员;
v_viewsql:='create or replace view '||table_record.table_name||' as select * from '|| uname||'.'||table_record.table_name;
--v_viewsql:='drop view view2_'||table_record.table_name;
--dbms_output.put_line(v_viewsql);
execute immediate v_viewsql ;
--dbms_output.put_line('ceshi');
END LOOP;
v_f1sql:= 'CREATE OR REPLACE FUNCTION 起始时间 RETURN DATE IS'||
' BEGIN '||
' RETURN(TO_DATE(TO_CHAR(SYSDATE,''YYYY"0101"''),''YYYYMMDD''));'||
'END;';
execute immediate v_f1sql;
v_f2sql:='CREATE OR REPLACE FUNCTION 截止时间 RETURN DATE IS'||
' BEGIN '||
' RETURN(TRUNC(LAST_DAY(SYSDATE)));'||
'END;';
execute immediate v_f2sql;
END;
但是执行该存储过程的用户必须有 独立的创建视图和存储过程的权限
grant create view to user
grant create procedure to user