zoukankan      html  css  js  c++  java
  • ORACLE数据库创建动态表

    最近公司一个项目代码里的定时任务无法执行,查验代码良久,奈何代码过于老旧,开发人员换了一茬又一茬,现在都无法理清,故无奈只好到数据库里重新写存过,配置定时任务。

    在写存过时,由于检测及安全性能要求,需要备份数据,设计是每次调用存过时就创建一张新表记录历史数据,开始时是准备直接一条语句搞定:

    BEGIN
     execute immediate 'create table tmp_a_'||to_char(sysdate, 'yyyymmdd')||' as select * from a';
    
    END;

    但是执行时报错,找了良久未发现问题所在,自己怀疑是拼接表名时字符串的问题,所以我调整了一下上面的语句:

    is
    tableName varchar2(30);
    BEGIN
      tableName :='tmp_a_'||to_char(sysdate,'yyyymmdd' );
     execute immediate 'create table ' || tableName  ||' as select * from a';
    
    END;

    这样就可以了,能够执行成功,问题也完美解决!

    PS:在存过里执行create语句时,有时会报“权限不足!”,这是因为Oracle8i及其后的版本,Oracle引入调用者(invoker)权限,使得对象可以以调用者身份和权限执行。遇到存储过程中带有Create Table的这种情况,通常解决方法是进行显式的系统权限: grant create table to username;但是,此方法太笨,因为有可能执行一个存储过程,需要很多不同权限(oracle对权限划分粒度越来越细)。最好的方法是,利用 oracle 提供的方法,在创建存储过程时,加入 Authid Current_User 条件进行权限分配。

    create or replace procedure p_test Authid Current_User 
    is
    begin
      execute immediate 'create table tmp(id number(1))';
    end p_test;

    分享一下,希望能帮到和我一样遇到此类问题的道友们!

  • 相关阅读:
    每日一小练——因子分解
    HDU 4588 Count The Carries 数位DP || 打表找规律
    ThinkPHP数据分页Page.class.php
    android与C# WebService基于ksoap通信(C#篇)
    HDU4009 Transfer water 【最小树形图】
    libmemcached的安装及測试
    Linux 静态链接库和动态连接库
    js实现table排序(jQuery下的jquery.sortElements)
    yum -y --downloadonly --downloaddir=/ruiy upggrde;
    yum -y --downloadonly --downloaddir=/root/ruiy update
  • 原文地址:https://www.cnblogs.com/wanghhe/p/9713938.html
Copyright © 2011-2022 走看看