#oracle #plsql #oracle11g #oracle-sqldeveloper #plsqldeveloper
Вопрос:
Я создал пакет, процедуру и функции внутри. У меня есть небольшое сомнение. Если я создал имя процедуры employee_dtls в пакете и в то же время процедуру employee_dtls в качестве независимого объекта в схеме.
Но я хочу вызвать независимую процедуру employee_dtls внутри моего пакета, но когда я пытаюсь вызвать процедуру внутри пакета, выполняется независимая процедура, которая не вызывается.
Я предполагаю, что, поскольку имена обеих процедур одинаковы, он вызывает процедуру внутри пакета.
Пожалуйста, помогите, что я могу сделать в этом случае?
Комментарии:
1. Это домашнее задание или реальная система? Мне очень трудно представить ситуацию в реальной системе, когда вам действительно нужна отдельная процедура с тем же именем, что и процедура в пакете. Если это домашнее задание, просто используйте полное имя объекта. Если это реальная система, сделайте шаг назад и пересмотрите свои стандарты именования.
2. @JustinCave Спасибо вам за ваш ответ. Это было просто для проверки, как мы можем этого достичь.
Ответ №1:
Что ты можешь сделать? Квалифицируйте название процедуры (как прокомментировал Джастин). Вот как (читайте комментарии в коде):
Автономная процедура:
SQL> create or replace procedure p_test is
2 begin
3 dbms_output.put_line('...standalone P_TEST procedure');
4 end;
5 /
Procedure created.
Упакованная процедура:
SQL> create or replace package pkg_test is
2 procedure p_test;
3 procedure p_run;
4 end;
5 /
Package created.
SQL> create or replace package body pkg_test is
2 procedure p_test is
3 begin
4 dbms_output.put_line('...packaged P_TEST procedure');
5 end;
6
7
8 procedure p_run is
9 begin
10 dbms_output.put_line('calling P_TEST');
11 p_test; -- no qualifier - runs the packaged procedure (that's what you have now)
12
13 dbms_output.put_line('calling SCOTT.P_TEST');
14 scott.p_test; -- procedure name preceded by owner name - runs the standalone procedure
15
16 dbms_output.put_line('calling PKG_TEST.P_TEST');
17 pkg_test.p_test; -- procedur ename preceded by package name - runs the packaged procedure
18 end;
19 end;
20 /
Package body created.
Тестирование:
SQL> set serveroutput on;
SQL> exec pkg_test.p_run;
calling P_TEST
...packaged P_TEST procedure
calling SCOTT.P_TEST
...standalone P_TEST procedure
calling PKG_TEST.P_TEST
...packaged P_TEST procedure
PL/SQL procedure successfully completed.
SQL>