Являются ли пакеты единственным способом вернуть данные из базы данных Oracle? - PullRequest
2 голосов
/ 17 июля 2011

До сих пор я в основном работал с SQL Server, и теперь я перехожу в Oracle для нового проекта.

Я пытаюсь создать процедуру, которая будет возвращать данные в приложение .net.Единственный способ заставить это работать - это использовать такие пакеты:

CREATE OR REPLACE PACKAGE GetAllDepartments AS
TYPE T_CURSOR IS REF CURSOR;
PROCEDURE p_GetAllDepartments
(
    cur_Result OUT T_CURSOR
);
END GetAllDepartments;

CREATE OR REPLACE PACKAGE BODY GetAllDepartments AS
PROCEDURE p_GetAllDepartments
(
    cur_Result OUT T_CURSOR
)
IS
BEGIN
    OPEN cur_Result FOR
    SELECT * FROM DEPARTMENTS;

END p_GetAllDepartments;
END GetAllDepartments;

Это единственный способ использовать Oracle? Не могу ли я просто создать proc и вызвать его напрямую?Спасибо

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

Если у вас есть поддерживаемая версия Oracle, вы сможете сделать что-то вроде

CREATE OR REPLACE PROCEDURE get_all_departments( p_result OUT SYS_REFCURSOR )
AS
BEGIN
  OPEN p_result
   FOR SELECT *
         FROM departments;
END get_all_departments;

Тем не менее, вы, как правило, лучше с точки зрения организации, используя пакеты для сбора процедур, которые делают связанные вещи. Например, в вашем случае, как правило, имеет смысл иметь пакет, содержащий все процедуры, относящиеся к отделам (т. Е. create_department, delete_department и т. Д.).

И с общей стилистической точки зрения в Oracle более распространено создание представления, которое реализует любую логику, которую вы бы поместили в хранимую процедуру, и запрашивать это представление, а не создавать хранимую процедуру, которая просто выполняет запрос. *

1 голос
/ 17 июля 2011

Вы можете сделать это без пакета, например, создав функцию, которая возвращает наборы результатов.

Эти функции могут использоваться как таблицы, например: SELECT * FROM my_function()

Это особенно эффективно с конвейерной функцией, поскольку результат не буферизуется на сервере, а отправляется строка за строкой клиенту:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_packages.htm#i1008519

Но основная техника все та же, т. Е. Вы должны определить тип, который используется для возвращаемого типа функции.Вы не можете заставить его возвращать «анонимный» набор результатов, как в PostgreSQL или SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...