过程给出ORA-00942:表存在时表或视图不存在

时间:2019-07-12 14:58:04

标签: sql oracle plsql

我不知道程序内的错误在哪里

我尝试在不同的SQL工作表,不同的连接中使用它

CREATE OR REPLACE PROCEDURE SERVICEINVOICE(v_name IN VARCHAR2)
IS
BEGIN
    SELECT * FROM S8.SERVWORK WHERE SERVINVNO = '&v_name';
END;
/
  

错误(4,1):PL / SQL:忽略了SQL语句错误(4,18):PL / SQL:   ORA-00942:表或视图不存在

2 个答案:

答案 0 :(得分:1)

该错误表明拥有serviceinvoice过程的用户或者没有对s8.servwork表的任何特权,或者仅具有由角色授予的特权。

如果您具有定义者权限程序(这是默认程序),则该程序的所有者需要对表具有特定的特权,等等。

因此,您需要以S8用户身份运行类似以下内容的程序才能正常工作:

grant select on servwork to <owner of your serviceinvoice procedure>;

如果您的过程还将在该表上进行插入,更新等操作,则您也需要授予这些特权。 (例如grant insert, select, ... to ...;

第二,您的选择需要将值返回到变量中,这是当前不执行的操作。根据您期望的是最多1行还是多行,这会影响您需要返回的变量类型。例如。如果要返回多行,则需要将其批量收集到必要的行类型的数组中,或者可能是一条记录或单个变量。

最后,在代码内部使用select * ...是不好的做法-您应明确指定要使用的列。如果有人在表中添加一列,则可以避免代码出错。

答案 1 :(得分:0)

该错误显然表明您的架构尚未被授权从SERVWORK架构的S8表中进行选择。但是,即使授予了所需的特权,SELECT语句仍缺少INTO子句来返回所需的列。的确,有一种实际的方法可以像您所使用的那样,在rowtype中使用S8.SERVWORK%rowtype伪列来返回所有列。因此,请尝试以下代码块:

SQL>SET SERVEROUTPUT ON
SQL>CREATE OR REPLACE PROCEDURE SERVICEINVOICE( v_name s8.servwork.servivvno%type ) IS
  v_servwork s8.servwork%rowtype;
BEGIN
  SELECT * INTO v_servwork FROM s8.servwork WHERE servivvno = v_name;
  DBMS_OUTPUT.PUT_LINE( v_servwork.col1||' - '||v_servwork.col2||' - '||v_servwork.col3);
END;
/

通过打印出来逐行检查返回的列。 ({col123被假定为s8.servwork表的列)