Tôi đang sử dụng Oracle 10.2.Tại sao tôi nhận được PLS-00302: thành phần phải được khai báo khi nó tồn tại?
Tôi đang làm việc trong một số tập lệnh để di chuyển một số đối tượng ORACLE từ một SCHEMA (S1) sang một SCHEMA (S1) khác (S2). Tôi đang tạo các chức năng với vai trò DBA. Khi di chuyển, một trong các chức năng của tôi trở nên không hợp lệ, nhưng tôi không hiểu tại sao. mã của nó đi dọc theo những dòng:
MY_FUNC
CREATE OR REPLACE FUNCTION S2."MY_FUNC" RETURN VARCHAR2 IS
something VARCHAR2;
othervar VARCHAR2 (50):= 'TEST';
BEGIN
something := S2.MY_FUNC2();
/*some code*/
return othervar;
END;
/
Nếu tôi sử dụng MY_FUNC2
mà không có lược đồ, Nó hoạt động:
something := MY_FUNC2();
thay vì something := S2.MY_FUNC2();
My_FUNC2
CREATE OR REPLACE FUNCTION S2."MY_FUNC2" RETURN VARCHAR2 IS
something BOOLEAN;
othervar VARCHAR2 (50) := 'TEST2';
BEGIN
/*some code*/
return othervar;
END;
/
MY_FUNC2 có một từ đồng nghĩa như thế này:
CREATE OR REPLACE PUBLIC SYNONYM "MY_FUNC2" FOR "S2"."MY_FUNC2"
MY_FUNC
biên dịch với các lỗi:
PLS-00.302: thành phần 'MY_FUNC2' phải được khai báo
tôi không hiểu tại sao tôi nhận được lỗi này, khi các hàm của tôi nằm trong lược đồ khác (S1) họ đã có chính xác cấu trúc tương tự và từ đồng nghĩa đã được tạo chính xác giống nhau (nhưng chỉ vào S1) và MY_FUNC
biên dịch tốt.
Tôi đã không tạo các hàm và từ đồng nghĩa này ban đầu. Có thể tôi thiếu một số đặc quyền trong S2, vì vậy MY_FUNC
có thể hoạt động bình thường không?
bạn có đang gọi hàm từ s1 hoặc s2 không? – Aramillo
Nếu bạn thực hiện cuộc gọi từ s1, bạn cần cấp đặc quyền thực thi cấp quyền cho s2.MY_FUNC2 thành s1. – Aramillo
theo như tôi hiểu điều này không phải là về cuộc gọi, nó thậm chí không biên dịch. Vì vậy, chỉ để đảm bảo, bởi vì nó không rõ ràng từ câu hỏi của bạn. Bạn đã đăng nhập là sys hay s2? Trước tiên bạn đã tạo MY_FUNC2, sau đó tạo từ đồng nghĩa công khai, sau đó là MY_FUNC? NẾU bạn là SYS hoặc S2 với việc tạo đặc quyền đồng nghĩa công khai và đã làm theo thứ tự này thì không có lý do gì để biên dịch (ngoại trừ my_func đã khai báo varchar2; không có độ chính xác) – Martina