WEB开发网
开发学院数据库Oracle 使用动态SQL克隆数据库对象 阅读

使用动态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;

Tags:使用 动态 SQL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接