使用动态SQL克隆数据库对象
2007-05-09 12:12:30 来源:WEB开发网核心提示: 如果这个过程是由对象所有者所有的,那么那个对象的源代码就可以通过一个 REF CURSOR 变量导出,使用动态SQL克隆数据库对象(2),如果这个过程被授予了其他用户 EXECUTE 权限,那么这个用户将能够调用这个过程并查看任何数据库对象的源代码——即使是那些没有
如果这个过程是由对象所有者所有的,那么那个对象的源代码就可以通过一个 REF CURSOR 变量导出。如果这个过程被授予了其他用户 EXECUTE 权限,那么这个用户将能够调用这个过程并查看任何数据库对象的源代码——即使是那些没有授权给他们的对象和那些在 ALL_SOURCE 中不给出的对象,比如 TYPE 声明。为了说明这种方法可行,请尝试在 SQL*Plus 中输入以下代码:
SQL> connect scott/tiger
SQL> create function foo return varchar2 as begin return 'hello world'; end;
SQL> /
SQL> @get_source.sql
SQL> variable c refcursor;
SQL> exec get_source('FUNCTION','FOO',:c);
SQL> print c
有了从对象所有者手中得到的源代码,调用者就可以在创建自己的方案中创建对象了。我们需要动态 SQL 来从文本字符串构建对象。另外一个需要处理的问题是一些数据库对象的源代码的长度可能会超过32767个字符,即超过 VARCHAR2 字符串的最大长度限制。这样就不能使用简单的 VARCHAR2 字符串来保存 SQL。在 Oracle 中有一个很少使用的变量DBMS_SQL.PARSE,可以使用它将源代码存储为一个由 VARCHAR2 字符行所组成的表中。这样的表可以用来存储超过32767长度限制的 SQL。(在实际的应用中,你可能还需要将任何大于256个字符的代码行包装起来,因为USER_SOURCE 最多只能存储4000行字符)。下面将其实现为一个带有命令行参数的 SQL*Plus 脚本的代码:
declare
ipls_integer := 1;
l_source dbms_sql.varchar2s;
l_line varchar2(256);
l_cursorsys_refcursor;
c pls_integer;
r pls_integer;
begin
&1..get_source('&2','&3',l_cursor);
l_source(i) := 'create or replace';
loop
fetch l_cursor into l_line;
exit when l_cursor%notfound;
i := i + 1;
l_source(i) := l_line.text;
end loop;
close l_cursor;
if i = 1 then
raise_application_error(-20000,'object does not exist');
end if;
c := dbms_sql.open_cursor;
dbms_sql.parse(c,l_source,1,l_source.count,true,dbms_sql.native);
dbms_sql.close_cursor(c);
end;
/
show errors;
- ››sql server自动生成批量执行SQL脚本的批处理
- ››使用linux中的quota教程
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››使用jxl生成带动态折线图的excel
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
更多精彩
赞助商链接