Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PLS-00201:必须声明标识符“类型”_Oracle_Plsql - Fatal编程技术网

Oracle PLS-00201:必须声明标识符“类型”

Oracle PLS-00201:必须声明标识符“类型”,oracle,plsql,Oracle,Plsql,我正在以user1身份连接到Oracle数据库。在数据库中,user2存在并有一个包pack1,其中包含两个存储过程proc1和proc2 我试图调用这些过程,但是我得到了前面提到的错误。该错误提到在类型中定义的“type1” 经过一些研究后,有人建议检查特权,但这些似乎没有问题。我使用的是Oracle SQL Developer,当我在pack1和type1上单击grants时,我的用户同时拥有执行和调试权限 我认为这是代码中的一个错误,但这会引发另一个错误。我曾想为这个包裹加上一个同义词,因

我正在以user1身份连接到Oracle数据库。在数据库中,user2存在并有一个包pack1,其中包含两个存储过程proc1和proc2

我试图调用这些过程,但是我得到了前面提到的错误。该错误提到在类型中定义的“type1”

经过一些研究后,有人建议检查特权,但这些似乎没有问题。我使用的是Oracle SQL Developer,当我在pack1和type1上单击grants时,我的用户同时拥有执行和调试权限

我认为这是代码中的一个错误,但这会引发另一个错误。我曾想为这个包裹加上一个同义词,因为我已经读到了这些可以帮助我,但我没有必要这样做,在我问之前,我想用尽我所有的选择

当我尝试运行这些存储过程时,我尝试使用我准备好的调用和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的透视图时,我才能看到所需的过程。 此外,我确信我有权限执行和调试所有必需的对象。即包和定义的类型。 当谈到特权是如何授予的时,有没有办法检查一下?我使用命令

SELECT * FROM USER_TAB_PRIVS;
将user2列为授予人和所有者,将user1列为受让人 编辑4 这是从用户选项卡中选择*的结果

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:修复了从小写到大写的结果表。然而,正如建议的那样,我仔细检查了包的名称和类型,它们确实是大写的

我认为你的主要问题是你类型的定义

你必须检查哪一行使用哪一种类型

你应该拥有:

user1->NO-TYPES,一个调用user2的包

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;
请记住: 两种类型永远不一样!如果在模式中使用类型,则不允许在另一个模式中定义类似的类型来检索对象。必须在other schema=user2.type1中显式命名类型。 您必须向希望使用示例中的类型的架构/用户授予权限授予类型和包权限

在现有项目中进行故障排除时,您可以逐步检查:

使用user1登录 编写一些使用您的类型的plsql

declare
    tmp user2.type1;
begin
    tmp := user2.type1('Mr.Smith');
    -- if this works, your type-privs are correct.
end;
编写一些使用该包的plsql


用户是否直接或通过角色(例如DBA角色)拥有权限?好的,那么您已经在使用其所有者对该类型进行资格验证;那么,您确定您的用户已被授予该SYSADM拥有类型的权限吗?表类型以及它是表的基础类型?正如Wernfried所说,hose是直接授予的还是通过角色授予的,这可能很重要,但如果您真的使用了匿名块,这就不重要了。另外,您显示的创建类型与错误消息中的类型名称不匹配?不,我希望是这一部分。如果您可以在“其他用户”下看到类型和包,这意味着您至少有一些权限。但你必须对电话进行限定;你现在正在做的事。你不会从你展示的包中得到错误。除非类型名称拼写错误,或者可能有带引号的标识符?希望不是,我不确定。这可能是一些我们看不到的明显而简单的东西。只是澄清一下:您已经作为您的用户在表类型及其下划线类型上执行了privs?对user_选项卡_privs的查询显示了标识符:user1 user2 type1 type2等-全部用小写。这意味着它们可能是使用带引号的标识符创建的,您必须使用带引号的标识符来引用它们,例如user1.type1。如果使用不带引号的标识符,例如:user1.type1'-则Oracle存储它们并将其视为大写。有关详细信息,请参见:@Lone_lower,当您以两个用户的身份运行查询时,它是相同的吗?所有对象都将 如果用户具有必要的权限,则返回对象