Oracle存储过程实现通过动态参数复制表

(作者:陈玓玏)
上一篇记录的是通过自定义函数复制表的笔记,但是觉得过程还是有些麻烦。觉得还是用存储过程更简洁些,今天就把存储过程的写法整理出来了。下面代码用的时候记得把相应位置变量替换成你自己的。

--使用存储过程复制表,使用存储过程来复制表比使用自定义函数更简单,因为自定义函数返回多行结果需要用游标,但带游标的查询语句不能用于create as。
create or replace procedure createtable(tname in varchar2,id in number)
is
   --sql_sent是用来存储sql语句的临时变量,存储过程可以不设置返回值,这也是它和自定义函数的重要区别
    sql_sent varchar2(20000);
begin
    sql_sent:='create table '||tname||' as select col from tableName where id='||id;
    execute immediate sql_sent;
    commit;
end;
--执行存储过程
exec createtable('new_tablename',112);

上面是比较简单的参数传入,涉及到时间参数时,处理起来会麻烦一些,时间参数如下:
上面是比较

//复制join之后的表,并将时间作为传入的参数。这个地方很容易出错,首先就是单引号的问题,需要再加单引号实现转义
,所以最好是用dbms_output.put_line(sql_sent);输出sql语句看一下是否正确
create or replace procedure createtable(tname in varchar2,date_time in varchar2)
is
    sql_sent varchar2(20000);
begin
    sql_sent:='''yyyy-mm-dd''';
    sql_sent:='create table '||tname||' as select * from tableName where trunc(sa_time)>=to_date('||date_time||','||sql_sent||')';
   --这样拼接的字符串作SQL语句常常容易出现拼写的问题,所以最好是输出语句检查一下是否存在问题
    dbms_output.put_line(sql_sent);
    execute immediate sql_sent;
    commit;
end;

--执行存储过程
exec createtable('newTableName','''2018-09-01''');

猜你喜欢

转载自blog.csdn.net/weixin_39750084/article/details/82874032
今日推荐