Я подключаюсь к базе данных Oracle как user1
. В базе данных существует user2
и имеет пакет pack1
, который содержит две хранимые процедуры, proc1
и proc2
.PLS-00201: идентификатор 'TYPE' должен быть объявлен
Я пытаюсь назвать эти процедуры, но я получаю вышеупомянутую ошибку. В ошибке упоминается «type1», который определен в «Типы».
После некоторого исследования было предложено проверить привилегии, однако, похоже, все в порядке. Я использую Oracle SQL Developer, и когда я нажимаю «гранты» на 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;
EDIT 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;
EDIT 2 как предложено @Alex Poole, я изменил свое заявление:
DECLARE
ClientData user2.type1;
однако, он воспроизводил ту же ошибку:
PLS-00201: identifier 'user2.type1' must be declared
EDIT 3
Неверные имена были вызваны тем, что я сбрасывал стерилизацию кода, это было исправлено.
Пакеты и оба типа принадлежат пользователю2. Когда я подключаюсь к базе данных, я не вижу ничего с моей точки зрения. Нет таблиц, пакетов или типов. Только когда я просматриваю «Другие пользователи» и смотрю в перспективе пользователя2, я могу видеть необходимые процедуры.
Также я уверен, что у меня есть привилегии (EXECUTE & DEBUG) для всех необходимых объектов. Это пакеты и определенные типы.
Говоря о том, как были предоставлены привилегии, есть ли способ проверить это?Я использовал команду
SELECT * FROM USER_TAB_PRIVS;
, что списки user2 как Концеденту и владелец и user1 как грантополучателей
EDIT 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
EDIT 5: Исправлена таблица результатов с нижнего регистра на верхний регистр. Однако, как было предложено, я дважды проверял имена пакета и Типы, они действительно в верхнем регистре.
Wh at is 'Types' - другой пакет, который определяет вещи, включая' type1'? Или это 'type1' тип SQL-уровня? Какой пользователь владеет пакетами/типами, и какой из них вы используете для этого анонимного блока? –
Имеет ли пользователь привилегии напрямую или через роль (например, роль DBA)? –
@AlexPoole Извините, что не разобрал его. «type1» - это таблица «type2». Чтобы сделать это более понятным, вот код: 'create или replace TYPE type1 IS TABLE OF type2;' –