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''');
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值