Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Возврат набора строк целиком (селект) при помощи процедуры с параметрами.  [new]
fatum2002
Member

Откуда:
Сообщений: 33
Здравствуйте.

Мне нужно вернуть набор строк, которые являются результатом сложного селекта с параметрами.
Приложение, которое я использую, умеет только вызывать процедуры с передачей им параметров - ничего другого.
Я написал селект с параметрами. Теперь хочу "обернуть" его в процедуру, которая будет вызываться из программы и подставлять параметры в селект. Результат нужно получить в виде набора строк (таблица. читать по одной строке курсором не выйдет).
С созданием такой процедуры и ее тестированием у меня возникли проблемы (вообще не думал, что так может быть, так как в МС это простейшая процедура с селектом в ней).
С ораклом вообще не работал. Нашел, что нужно использовать выходной параметр SYS_REFCURSOR. Но все равно в сомнениях, так как по идее, если это курсор, то он не может сразу вернуть весь набор строк (или может?). Не могу заставить работать даже простейший тест:

CREATE OR replace PROCEDURE getStuckTransactions 
(
  sender IN varchar, receiver IN varchar, tr_date in varchar, timeframe in varchar, selectCursor OUT SYS_REFCURSOR 
)   
IS   
BEGIN   
OPEN selectCursor FOR SELECT TRANS.*, sender as sender, receiver as receiver, tr_date as tr_date, timeframe as timeframe from TRANS;   
END;


var selectCursor REFCURSOR
exec getStuckTransactions('Sender','Receiver','04-MAR-16','20', selectCursor)
print selectCursor



Error starting at line : 12 in command -
exec getStuckTransactions('Sender','Receiver','04-MAR-16','20', selectCursor)
Error report -
ORA-06550: line 1, column 66:
PLS-00201: identifier 'SELECTCURSOR' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

SP2-0552: Bind Variable "SELECTCURSO" is not declared.
4 мар 16, 18:06    [18898150]     Ответить | Цитировать Сообщить модератору
 Re: Возврат набора строк целиком (селект) при помощи процедуры с параметрами.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
SQL> create or replace
  2    procedure p1(
  3                 p_cur out sys_refcursor
  4                )
  5      is
  6      begin
  7          open p_cur for 'select * from dept';
  8  end;
  9  /

Procedure created.

SQL> variable selectCursor REFCURSOR
SQL> exec p1(selectCursor)
BEGIN p1(selectCursor); END;

         *
ERROR at line 1:
ORA-06550: line 1, column 10:
PLS-00201: identifier 'SELECTCURSOR' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


SQL> exec p1(:selectCursor)

PL/SQL procedure successfully completed.

SQL> print selectCursor

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> 


SY.
4 мар 16, 18:18    [18898188]     Ответить | Цитировать Сообщить модератору
 Re: Возврат набора строк целиком (селект) при помощи процедуры с параметрами.  [new]
fatum2002
Member

Откуда:
Сообщений: 33
Спасибо. Это заработало в oracle SQL Developer.

Не понятно теперь как это вызывать из программы - что передавать процедуре на место того параметра, который курсор.

Вот думаю, что может сделать это в два этапа - сначала вызовом процедуры заполнить таблицу в базе, а вторым шагом сделать из нее селект. Но как-то не хочется для этого таблицу в базе иметь.
4 мар 16, 18:50    [18898308]     Ответить | Цитировать Сообщить модератору
 Re: Возврат набора строк целиком (селект) при помощи процедуры с параметрами.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
fatum2002
Не понятно теперь как это вызывать из программы


Программа то на чем написана?

SY.
4 мар 16, 21:09    [18898833]     Ответить | Цитировать Сообщить модератору
 Re: Возврат набора строк целиком (селект) при помощи процедуры с параметрами.  [new]
not create or drop procedure
Guest
fatum2002
Не понятно теперь как это вызывать из программы
SELECT TRANS.*, 'Sender','Receiver','04-MAR-16','20' from TRANS;   
4 мар 16, 21:17    [18898859]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить