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 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创建序列为何会遇到权限不足的问题呢?的主要内容,如果未能解决你的问题,请参考以下文章