oracle 存储过程 创建表

前端之家收集整理的这篇文章主要介绍了oracle 存储过程 创建表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. 需求: 存储过程完成一年创建一个表
  1.  
  1. 实现代码如下:
  1. CREATE OR REPLACE
  2. procedure TEST123456 AS
  3. suffix_year VARCHAR(5);
  4. TABLENAME VARCHAR(40);
  5.  
  6. BEGIN
  7. SELECT TO_CHAR(SYSDATE,'yyyy') INTO suffix_year FROM DUAL;
  8. TABLENAME:='TEST'||suffix_year;
  9. DBMS_OUTPUT.put_line(suffix_year);
  10. CREATE TABLE TABLENAME||'123' AS select * from TEST t WHERE 1=2;
  11.  
  12. -- EXCEPTION
  13. -- WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('异常');
  14.  
  15. END;
  1. 上面的方法一直编译不过去,因为我的表名称是一个变量,后来通过查阅各种资料了解到 可以用execute immediate 来实现!
  1.  
  1. 新实现代码如下:
  1. CREATE OR REPLACE
  2. procedure TEST123456 AS
  3. suffix_year VARCHAR(5);
  4. TABLENAME VARCHAR(40);
  5.  
  6. BEGIN
  7. SELECT TO_CHAR(SYSDATE,'yyyy') INTO suffix_year FROM DUAL;
  8. TABLENAME:='TEST'||suffix_year;
  9. DBMS_OUTPUT.put_line(suffix_year);
  10. --CREATE TABLE TABLENAME||'123' AS select * from ZP_SCAN_ORDER t WHERE 1=2;
  11. execute immediate 'CREATE TABLE '||TABLENAME || ' AS select * from ZP_SCAN_ORDER t WHERE 1=2 ';
  12.  
  13. -- EXCEPTION
  14. -- WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('异常');
  15.  
  16. END;
上面方法编译算是成功了,但是在执行的时候发现 执行错误提示是权限不足,然而我们把
  1. execute immediate 'CREATE TABLE '||TABLENAME || ' AS select * from ZP_SCAN_ORDER t WHERE 1=2 ';
直接在plsql中执行是没有问题的!


这个问题怎么解决呢?


既然提示权限不足,那我就赋值权限给当前用户user1,以sys用户登录 执行如下sql:

  1. GRANT CREATE ANY TABLE TO user1
  1.  
  1. 再次执行存储过程,没有问题,成功!

猜你在找的Oracle相关文章