- 需求: 存储过程完成一年创建一个表
- 实现代码如下:
- CREATE OR REPLACE
- procedure TEST123456 AS
- suffix_year VARCHAR(5);
- TABLENAME VARCHAR(40);
- BEGIN
- SELECT TO_CHAR(SYSDATE,'yyyy') INTO suffix_year FROM DUAL;
- TABLENAME:='TEST'||suffix_year;
- DBMS_OUTPUT.put_line(suffix_year);
- CREATE TABLE TABLENAME||'123' AS select * from TEST t WHERE 1=2;
- -- EXCEPTION
- -- WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('异常');
- END;
- 新实现代码如下:
上面方法编译算是成功了,但是在执行的时候发现 执行错误,提示是权限不足,然而我们把
- CREATE OR REPLACE
- procedure TEST123456 AS
- suffix_year VARCHAR(5);
- TABLENAME VARCHAR(40);
- BEGIN
- SELECT TO_CHAR(SYSDATE,'yyyy') INTO suffix_year FROM DUAL;
- TABLENAME:='TEST'||suffix_year;
- DBMS_OUTPUT.put_line(suffix_year);
- --CREATE TABLE TABLENAME||'123' AS select * from ZP_SCAN_ORDER t WHERE 1=2;
- execute immediate 'CREATE TABLE '||TABLENAME || ' AS select * from ZP_SCAN_ORDER t WHERE 1=2 ';
- -- EXCEPTION
- -- WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('异常');
- END;
直接在plsql中执行是没有问题的!
- execute immediate 'CREATE TABLE '||TABLENAME || ' AS select * from ZP_SCAN_ORDER t WHERE 1=2 ';
这个问题怎么解决呢?
既然提示权限不足,那我就赋值权限给当前用户user1,以sys用户登录 执行如下sql:
- GRANT CREATE ANY TABLE TO user1
- 再次执行存储过程,没有问题,成功!