Поиск…


Синтаксис

  • CREATE [OR REPLACE] PACKAGE имя_пакета

    [AUTHID {CURRENT_USER | DEFINER}]

    {IS | КАК}

    [PRAGMA SERIALLY_REUSABLE;]

    [collection_type_definition ...]

    [record_type_definition ...]

    [subtype_definition ...]

    [collection_declaration ...]

    [constant_declaration ...]

    [exception_declaration ...]

    [object_declaration ...]

    [record_declaration ...]

    [variable_declaration ...]

    [cursor_spec ...]

    [function_spec ...]

    [procedure_spec ...]

    [call_spec ...]

    [PRAGMA RESTRICT_REFERENCES (утверждения) ...]

    END [имя_пакета];

  • СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПАКЕТ PackageName IS

    ФУНКЦИЯ FunctionName (параметр1 IN VARCHAR2, параметр2 IN NUMBER) RETURN VARCHAR2;

    END PackageName;

  • CREATE [OR REPLACE] PACKAGE BODY имя_пакета

    {IS | КАК}

    [PRAGMA SERIALLY_REUSABLE;]

    [collection_type_definition ...]

    [record_type_definition ...]

    [subtype_definition ...]

    [collection_declaration ...]

    [constant_declaration ...]

    [exception_declaration ...]

    [object_declaration ...]

    [record_declaration ...]

    [variable_declaration ...]

    [cursor_body ...]

    [function_spec ...]

    [procedure_spec ...]

    [call_spec ...]

    END [имя_пакета];

  • СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПАКЕТНЫЙ ТЕЛО PackageName IS

    ФУНКЦИЯ FunctionName (параметр1 IN VARCHAR2, paramter2 IN NUMBER) RETURN VARCHAR2 IS

    декларации

    НАЧАТЬ

    операторы для выполнения

    RETURN переменная varchar2

    END FunctionName;

    END PackageName;

Использование пакета

Пакеты в PLSQL представляют собой набор процедур, функций, переменных, исключений, констант и структур данных. Как правило, ресурсы в пакете связаны друг с другом и выполняют аналогичные задачи.

Зачем использовать пакеты

  • модульность
  • Лучшая производительность / функциональность

Части пакета

Спецификация - иногда называется заголовком пакета. Содержит объявления переменных и типов и подписи функций и процедур, которые находятся в пакете, которые публично вызывают извне пакета.

Body Package - содержит код и частные объявления.

Спецификация пакета должна быть скомпилирована перед телом пакета, иначе компиляция тела пакета сообщит об ошибке.

перегрузка

Функции и процедуры в пакетах могут быть перегружены. Следующий пакет TEST имеет две процедуры, называемые print_number , которые ведут себя по-разному в зависимости от параметров, с которыми они вызываются.

create or replace package TEST is
  procedure print_number(p_number in integer);
  procedure print_number(p_number in varchar2);
end TEST;
/
create or replace package body TEST is

  procedure print_number(p_number in integer) is
  begin
    dbms_output.put_line('Digit: ' || p_number);    
  end;
  
  procedure print_number(p_number in varchar2) is
  begin
    dbms_output.put_line('String: ' || p_number);    
  end;

end TEST;
/

Мы называем обе процедуры. Первый с целым параметром, второй с varchar2.

set serveroutput on;
-- call the first procedure
exec test.print_number(3);
-- call the second procedure
exec test.print_number('three');

Вывод приведенного выше сценария:

SQL> 
Digit: 3
PL/SQL procedure successfully completed
String: three
PL/SQL procedure successfully completed

Ограничения на перегрузку

Могут быть перегружены только локальные или упакованные подпрограммы или методы типа. Поэтому вы не можете перегружать автономные подпрограммы. Кроме того, вы не можете перегружать две подпрограммы, если их формальные параметры отличаются только именем или параметром

Определите заголовок и тело пакета с помощью функции.

В этом примере мы определяем заголовок пакета и тело пакета с функцией.
После этого мы вызываем функцию из пакета, возвращающую возвращаемое значение.

Заголовок пакета :

CREATE OR REPLACE PACKAGE SkyPkg AS

       FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
       RETURN VARCHAR2;
       
END;
/

Корпус упаковки :

CREATE OR REPLACE PACKAGE BODY SkyPkg AS

        FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
        RETURN VARCHAR2
        AS
               vColour VARCHAR2(100) := NULL;
        BEGIN
               IF vPlanet = 'Earth' THEN
                       vColour := 'Blue';
               ELSIF vPlanet = 'Mars' THEN
                       vColour := 'Red';
               END IF;

               RETURN vColour;
        END;
        
END;
/

Вызов функции из корпуса пакета :

DECLARE
        vColour VARCHAR2(100);
BEGIN
        vColour := SkyPkg.GetSkyColour(vPlanet => 'Earth');
        DBMS_OUTPUT.PUT_LINE(vColour);
END;
/


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow