我不知道程序内的错误在哪里。
我尝试在不同的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:表或视图不存在
答案 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;
/
通过打印出来逐行检查返回的列。 ({col1
,2
,3
被假定为s8.servwork
表的列)