oracle 在存储过程中用动态sql创建序列为何会遇到权限不足的问题呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 在存储过程中用动态sql创建序列为何会遇到权限不足的问题呢?相关的知识,希望对你有一定的参考价值。

源码如下
SQL> create or replace procedure pro_temp
as
i number;
j number;
k number;
begin
execute immediate 'create sequence sq';
end pro_temp;
/
编译没问题,在以sysdba身份可以顺利执行,为何以普通身份执行就提示权限不足呢?
上边i,j,k没用,我只是试下到目前为止是否正确,就发现这问题了

create or replace procedure
create sequence
都需要权限。。。
用sysdba给该用户grant一个吧。。
GRANT EXECUTE ANY PROCEDURE TO 普通用户 WITH ADMIN OPTION;
GRANT RESOURCE TO 普通用户; --这个已经包含了序列的权限
参考技术A 从控制台进去给用户赋予权限。oracle权限很多很细的,鼠标点死,怕烦就赋dba。 参考技术B 当然不行了,你没给普通用户授权执行表空间的添加删改的权限

如何在oracle存储过程中执行动态sql语句

给你一个案例对这些,使用execute immediate就可以了,存储过程和语句块也是一样的,自己改一改,没区别的。

语法格式
EXECUTE IMMEDIATE dynamic_string
  [INTO define_variable[, define_variable]... | record]
  [USING [IN | OUT | IN OUT] bind_argument [, [IN | OUT | IN OUT] bind_argument]...]
  [RETURNING | RETURN INTO bind_argument[, bind_argument]...];
  
1, 操作 DDL语句,这也是动态 SQL的常用操作之一
如下所示使用动态 SQL创建 数据库表:
DECLARE
  l_dync_sql VARCHAR2(100);
BEGIN
  l_dync_sql := \'CREATE TABLE cux_dync_test(id NUMBER, creation_date DATE)\';
  EXECUTE IMMEDIATE l_dync_sql;
END;
2,操作 DML语句,使用 USING子句可以按照顺序将输入的值绑定到变量,如果动 态SQL只有单行输出的话可以直接使用 INTO来接收输出值,如下所示。
DECLARE
  l_dync_sql    VARCHAR2(100);
  l_person_name VARCHAR2(140);
  l_age         NUMBER;
BEGIN
  l_dync_sql := \'SELECT person_name, age FROM cux_cursor_test WHERE person_id = :1\';
  EXECUTE IMMEDIATE l_dync_sql
    INTO l_person_name, l_age -- 使用into语句接手动态SQL的输出,如果输出多行则出错
    USING 101; -- 给绑定变量赋值
  dbms_output.put_line(\'Person Name: \' || l_person_name);
  dbms_output.put_line(\'Age: \' || l_age);
END;
参考技术A CREATE OR REPLACE Procedure UP_ExecSqlProcForDS(strSql In Varchar2,cur_out Out sys_refcursor)AsBeginOpen cur_out ForstrSql;End;

以上是关于oracle 在存储过程中用动态sql创建序列为何会遇到权限不足的问题呢?的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle存储过程中drop 序列和新建序列

存储过程语法 sqlserver

oracle笔记-动态SQL

oracle中如何执行包含动态SQL的存储过程?

如何在oracle存储过程中执行动态sql语句

需要将以下存储过程从 Oracle 转换为 SQL