oracle 创建存储过程部分表编译错误是不是表空间、权限不足?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 创建存储过程部分表编译错误是不是表空间、权限不足?相关的知识,希望对你有一定的参考价值。

create or replace procedure zc_test_temp5(temp_date in varchar)
as
begin
insert into zc_jtjtzk a (a.wljts,a.zc_date) (select count(*),'20100404' from hy c);
declare t_counts number:=0 ;
begin
select count(b.industy_id) into t_counts from hy b;
update zc_jtjtzk a set a.yjwljts=t_counts;
update zc_jtjtzk a set a.jtzjfgl=t_counts;
end;
commit;
end;
/

把表hy 换成表bb.sys_user就执行不起来了,hy是自己建的表,bb.sys_user是其他人建的表,是否是表空间或权限问题,如何解决?
在线等!适量加分。
/*警告: 创建的过程带有编译错误

我的用户权限

1 CREATE SESSION
2 ALTER SESSION
3 CREATE TABLE
4 CREATE ANY TABLE
5 CREATE CLUSTER
6 CREATE SYNONYM
7 CREATE VIEW
8 CREATE SEQUENCE
9 CREATE DATABASE LINK
10 CREATE PROCEDURE

*/

不在同一个表空间,如何解决呢?

参考技术A 你先查看错误是什么啊,好像有个什么show error的吗?
有可能是权限问题,你当前用户需要获得该表的使用权限,你上面列出来的是系统权限,还有对象的权限,你针对哪个对象有什么样的权限,需要授权,同样使用grant 授权,列如:grant select on table to user;记得没错就是这样的。还有就是该用户也要用相应表空间的使用权,这个就是修改用户的定义,指定能使用该表空间吧,没有看参考,提供这些给你参考哈!
参考技术B 提示什么错误?
根据错误信息才能判断什么错误.

一般是权限不够. 没有update或insert 那个table的权限

Oracle创建存储过程

存储过程:
  存储过程是在oracle中存取完成特定业务逻辑的代码块。存储过程是命名块。命名块会存储到数据库中。匿名块每次运行都需要提前编译。命名块一次存储,只会编译一次。命名块可以多次使用。
  创建存储过程的语法:
    create [or replace ] procedure 存储过程的名称[(参数名 [in/out/ inout ] 参数类型,参数名 ....)]is/as
      变量声明部分
    begin
      业务逻辑处理部分
    exception
      异常处理部分
    end;
注意:
1,存储过程名称一般以pro_开头
2,存储过程可以没有参数 ,如果没有参数不用加()
3,过程的参数分三种, 入参 in 出参out 出入参inout 如果不写,默认是in。通过定义多个出参 过程可以返回多个
参数
4,过程或者函数的参数定义类型的时候不能有精度
 
举例:使用pl sql声明一个存储过程 传一个员工编号的参数 返回员工的姓名和基本工资
-- 创建存储过程 输入员工编号 返回员工姓名 基本工资
create or replace procedure pro_emp_test(v_empno number,v_ename
out varchar2,v_sal out number)
is
--变量声明部分
begin
--业务逻辑处理部分
select ename ,sal into v_ename,v_sal from emp where empno=v_empno;
end;
使用匿名块调用存储过程:
--匿名块中调用存储过程
declare
-- 声明参数用来接收出参
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--调用存储过程
pro_emp_test(7369,v_ename,v_sal);
-- 调用过程之后 v_ename 和v_sal就有值了 可以打印结果
dbms_output.put_line(‘员工姓名:‘||v_ename||‘员工基本工资:‘||v_sal);
end;
 
举例:写存储过程 ,输入员工编号,在过程中打印员工的姓名和基本工资
-- 创建存储过程 输入员工编号 打印员工姓名 基本工资
create or replace procedure pro_emp_test2(v_empno number)
is
--变量声明部分
v_ename varchar2(100);
v_sal emp.sal%type;
begin
--业务逻辑处理部分
select ename ,sal into v_ename,v_sal from emp where empno=v_empno;
--打印结果
dbms_output.put_line(‘员工姓名:‘||v_ename||‘,员工基本工资:‘||v_sal);
end;
对于没有出参的过程,我们可以通过call关键字执行调用:
-- 通过call 调用没有出参的存储过程
call pro_emp_test2(7369);
过程传递参数的三种方式
举例:写一个过程,在过程中打印三个数的和
--定义存储过程 计算三个数的和 create or replace procedure pro_sum_test(v_num1 number,v_num2
number,v_num3 number)
is
-- 声明和的变量 v_sum number(10,2);
begin v_sum:=v_num1+v_num2+v_num3;
dbms_output.put_line(‘v_num1:‘||v_num1||‘+v_num2:‘||v_num2||‘+v_num3:‘||v_num3||
‘=v_sum:‘||v_sum );
end;
按位置传参
原先我们调用存储过程的方式就是通过按位置传递参数。
-- 按位置传递参数
call pro_sum_test(1,2,3);
按名称传参
按位置传参不容易看出哪个参数是什么含义,所以我们也可以使用按形参名称的方式传参数
-- 按名称的方式传递参数
call pro_sum_test(v_num2=>2,v_num1=>1,v_num3=>3);
注意:按名称传递参数使用=>关键字,传递参数的时候名称必须和过程的形参名称一致
按位置传参 优点:容易理解 缺点:不容易看到每个参数代表什么含义
按名称传参 优点:容易看到每个参数代表什么汉含义 缺点:传递参数是名称必须要和形参名称一致,如果修改形
参名称了,调用这个过程的所有的地方都要修改。
按位置和名称传参
传递参数的时候我们可以混合使用按位置和按名称的方式,不过要保证先按位置传递参数,再按名称传递。
-- 按名称的方式传递参数
call pro_sum_test(v_num2=>2,v_num1=>1,v_num3=>3);
-- 混合传递参数 必须先按位置 再按名称传递
call pro_sum_test(1,v_num3=>3,v_num2=>2);
-- 不能先按名称 再按位置传递
call pro_sum_test(v_num2=>2,v_num1=>1,3);
注:创建过程,没有参数可以不写括号,但是call调用需要带括号!!!

以上是关于oracle 创建存储过程部分表编译错误是不是表空间、权限不足?的主要内容,如果未能解决你的问题,请参考以下文章

oracle的存储过程中,使用select into 语句的错误

数据库创建表空间临时表空用户授权

表空间详解

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。

oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下:

oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下: