2016-04-24 2 views
0

В SQL Server я могу просто использовать «RETURNS TABLE», и он выполнит эту работу. Но я не могу найти, как сделать то же самое в Oracle SQLOracle SQL Создать функцию или процедуру, возвращающую таблицу

У меня есть следующий ЗЕЬЕСТ, который должен быть положен в функции или процедуры:

SELECT a.CodAcord, a.Descr 
FROM FreqSoce f 
LEFT JOIN Acord a ON a.CodAcord = f.CodAcord 
WHERE f.codSoce = codSoce; 

codSoce является целым числом в параметре, и Мне нужно вернуть a.CodAcord и a.Descr в результате моей функции/процедуры.
Есть ли простой способ сделать это? Без того, чтобы иметь дело с температурными переменными и/или расширенным содержанием ...

EDIT: Допа информация:
- Мне нужно вернуться a.CodAcord и a.Descr, но когда я сделал некоторые исследования, чтобы знать, как вернуть более одна переменная, использующая SQL-функции или процедуры, все, что я мог найти, это то, что это было возможно только путем возврата TABLE. Если есть способ вернуть более одного элемента из функции или процедуры, пожалуйста, дайте мне знать.
- Использование функций или процедур строго требуется.
- Я использую SQL Developer.

+0

вам нужно возвратить a.CodAcord и a.Descr для данного codScoce, или вам нужно возвращать таблицу ли? Я не вижу связи. Также: вам нужна процедура для этого или достаточно использовать переменные связывания? Что вы используете для взаимодействия с Oracle: SQL * Plus? Жаба? Разработчик SQL? Каждый из них имеет свои средства, позволяющие вам «вводить» переменную связывания и производить вывод на основе этого. Просьба уточнить, и мы можем взять его оттуда. – mathguy

+0

Дополнительная информация предоставлена, спасибо за помощь. –

ответ

0

Возьмите следующее в качестве шаблона кода:

CREATE OR REPLACE PACKAGE tacord AS 
    TYPE ttabAcord IS TABLE OF ACord%ROWTYPE; 
END tacord; 
/
show err 

CREATE OR REPLACE PACKAGE BODY tacord AS 
BEGIN 
    NULL; 
END tacord; 
/
show err 

CREATE OR REPLACE FUNCTION demo RETURN tacord.ttabAcord AS 
    to_return tacord.ttabAcord; 
BEGIN 
       SELECT a.* 
    BULK COLLECT INTO to_return 
       FROM FreqSoce f 
      LEFT JOIN Acord a ON a.CodAcord = f.CodAcord 
       WHERE f.codSoce = codSoce 
        ; 
    RETURN to_return; 
END demo; 
/
show err 

Ключевых моментов:

  • %ROWTYPE представляет тип данных записи таблицы базы данных, в
  • BULK COLLECT INTO вставляют полный набор результатов в данную PLSQL структура
  • Итерация над содержимым таблицы доступна методами сбора данных plsql, а именно .FIRST, .LAST, .NEXT.
+0

Исправлен шаблон кода. – collapsar

+0

код компилируется, но выполнение с использованием SQL Developer ничего не возвращает, есть ли специальный способ выполнить это? –

+0

Извините, я обычно не работаю с sql dev. – collapsar

0

Вы можете получить таблицу как возвращаемое значение из функции с помощью конвейерной функции таблицы. Пожалуйста, смотрите пример ниже:

-- Create synthetic case 
CREATE TABLE Acord AS 
SELECT rownum CodAcord, 'Description ' || rownum Descr 
    FROM dual CONNECT BY LEVEL <= 5; 

CREATE TABLE FreqSoce AS 
SELECT rownum CodSoce, rownum CodAcord 
    FROM dual CONNECT BY LEVEL <= 10; 

-- Test dataset 
SELECT a.CodAcord, a.Descr 
    FROM FreqSoce f 
    LEFT JOIN Acord a ON a.CodAcord = f.CodAcord 
WHERE f.CodSoce = 10; 

-- Here begins actual code 
-- Create an object type to hold each table row 
CREATE OR REPLACE TYPE typ_acord AS OBJECT(
    CodAcord NUMBER, 
    Descr VARCHAR2(40) 
); 
/

-- Create a collection type to hold all result set rows 
CREATE OR REPLACE TYPE tab_acord AS TABLE OF typ_acord; 
/

-- Our function that returns a table 
CREATE OR REPLACE FUNCTION getAcord(pCodSoce IN NUMBER) 
RETURN tab_acord PIPELINED 
AS 
BEGIN 
    FOR x IN (SELECT a.CodAcord, a.Descr 
       FROM FreqSoce f 
       LEFT JOIN Acord a ON a.CodAcord = f.CodAcord 
      WHERE f.CodSoce = pCodSoce) 
    LOOP 
    PIPE ROW (typ_acord(x.CodAcord, x.Descr)); 
    END LOOP; 
END; 
/

-- Testing the function (please note the TABLE operator) 
SELECT * FROM TABLE(getAcord(5)); 
Смежные вопросы