我以user1
身份连接到Oracle数据库。在数据库中,user2
存在并且包含pack1
个包,其中包含两个存储过程proc1
和proc2
。
我试图调用这些程序,但我收到了上述错误。错误提及' type1'在类型中定义。
经过一些研究,有人建议检查权限,但这些似乎没问题。我正在使用Oracle SQL Developer,当我点击" grants"在pack1
和type1
上,我的用户具有EXECUTE和DEBUG权限。
我认为这是代码中的错误,但这会引发不同的错误。我想到了创造包装的同义词,因为我已经读过这些可以提供帮助,但我没有必要这样做,在我问之前,我想用尽所有的选择。
当我尝试运行这些存储过程时,我尝试使用我准备好的调用和SQL Developer创建的默认调用。有趣的是,当我运行我的代码时,会提到错误。当我运行"默认"我得到的代码"绝对URI中的相对路径"错误。
有什么我可以错过的吗?
这是我用来调用程序的代码。
DECLARE
ClientData type1;
BEGIN
pack1.proc1(param1,param2,ClientData);
FOR i IN 1..ClientData.LAST LOOP
DBMS_OUTPUT.PUT_LINE(ClientData(i).kid ||' '...;
--DBMS_OUTPUT.PUT_LINE(ClientData(i).portfolioName);
--DBMS_OUTPUT.PUT_LINE(ClientData(i).clientCategory);
--DBMS_OUTPUT.PUT_LINE(ClientData(i).typ_pf);
--DBMS_OUTPUT.PUT_LINE(ClientData(i). ptf_ccy);
END LOOP;
END;
编辑1:这是完整的错误:
ORA-06550: row 2, column 14:
PLS-00201: identifier 'SYSADMIN(user2).CLIENTDATAINSTRESB_A(type1)' must be declared
ORA-06550: row 2, column 14:
PL/SQL: Item ignored
ORA-06550: row 4, column 53:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: row 4, column 1:
PL/SQL: Statement ignored
ORA-06550: row 5, column 13:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: row 5, column 1:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
在正常情况下,我会包括程序的主体,但是,这是业务,因此我无法分享。
根据我的理解,在通话开始时,声明会失效,因此会导致其余的错误,因为这些错误会导致' type1'被称为。
进一步解释' type1'是,它是对表格的反思(' type2')。它由以下代码创建:
create or replace TYPE type1 IS TABLE OF type2;
编辑2 正如@Alex Poole建议的那样,我修改了我的声明:
DECLARE
ClientData user2.type1;
然而,它再现了同样的错误:
PLS-00201: identifier 'user2.type1' must be declared
编辑3
不正确的名字是由我伪造代码消毒引起的,它是固定的。
包和两种类型都归user2所有。当我连接到数据库时,我从我的角度看不到任何东西。没有表格,包裹或类型。只有当我浏览,其他用户"并且从user2的角度来看,我可以看到所需的程序。
另外,我很肯定我对所有必需的对象都有权限(EXECUTE& DEBUG)。那就是包和定义的类型。
在谈论如何授予权限时,有没有办法检查?我用了命令
SELECT * FROM USER_TAB_PRIVS;
将user2列为授予者和所有者,将user1列为受让人
编辑4
这是SELECT * FROM USER_TAB_PRIVS;
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY COMMON TYPE
USER1 USER2 TYPE2 USER2 DEBUG NO NO NO TYPE
USER1 USER2 TYPE2 USER2 EXECUTE NO NO NO TYPE
USER1 USER2 TYPE1 USER2 DEBUG NO NO NO TYPE
USER1 USER2 TYPE1 USER2 EXECUTE NO NO NO TYPE
USER1 USER2 PACK1 USER2 DEBUG NO NO NO PACKAGE
USER1 USER2 PACK1 USER2 EXECUTE NO NO NO PACKAGE
PUBLIC SYS USER1 USER1 INHERIT PRIVILEGES NO NO NO USER
编辑5:修正了从小写到大写的结果表。然而,正如所建议的那样,我仔细检查了包的名称和类型,它们确实是大写的。
答案 0 :(得分:0)
我认为你的主要问题是你的类型的定义。
您必须检查哪一行使用哪种类型。
你应该拥有什么:
user1 - > NO TYPES,一个调用user2-stuff的包
user2 - > Type1,Pack1,Proc1
示例:
-- Create your type on schema user2
CREATE OR REPLACE TYPE USER2.TestType AS OBJECT
(
NEWATTRIB1 VARCHAR2(1000)
)
/
-- Create your package at user2
CREATE OR REPLACE PACKAGE user2.TestPackage AS
FUNCTION MyFunction(Param1 IN TestType) RETURN TestType;
END TestPackage;
/
CREATE OR REPLACE PACKAGE BODY user2.TestPackage AS
FUNCTION MyFunction(Param1 IN TestType) RETURN TestType IS
BEGIN
RETURN Param1;
END;
END TestPackage;
/
-- Grant rights user1 (run with user2)
GRANT ALL ON TestType TO User1 WITH GRANT OPTION;
GRANT EXECUTE ON TestPackage TO User1 WITH GRANT OPTION;
-- Call proc from User1
declare
tmp USER2.TestType;
tmp2 USER2.TestType;
begin
tmp := USER2.TestType('Mr.Smith');
tmp2 := USER2.TESTPACKAGE.MYFUNCTION(tmp);
dbms_output.put_line('tmp: ' || tmp.NEWATTRIB1);
dbms_output.put_line('tmp2: ' || tmp2.NEWATTRIB1);
end;
请记住: 两种类型永远不会相同!如果在模式中使用类型,则不允许在另一个模式中定义类似类型以检索该对象。您必须在另一个模式(= user2.type1)中明确命名该类型。 您必须向想要使用该类型的模式/用户授予权限(在您的示例中为grant type-和package-privs)。
作为现有项目中的故障排除,您可以逐步检查:
编写一些使用您的类型
的plsqldeclare
tmp user2.type1;
begin
tmp := user2.type1('Mr.Smith');
-- if this works, your type-privs are correct.
end;
编写一些使用包