2009-06-30 2 views
3

У меня есть сохраненный proc в сервере с Oracle 11g, который имеет переменную переменной записи. Я не могу отредактировать эту процедуру. Я создаю функцию, которая вызовет процедуру и вернет информацию в набор записей. Я рассмотрел следующий вопрос, заданный здесь: past questionВыберите данные из типа коллекции записей

Мой вопрос: могу ли я создать тип таблицы для записи и запросить ее непосредственно в SQL? Или мне нужно преобразовать запись для ввода типа объекта и создать тип таблицы для непосредственного запроса?

+0

Какие RDMS вы используете? То, что вы можете делать внутри хранимой процедуры, зависит от платформы. –

+0

Извините, я использую oracle 11g – Slowbie

ответ

1

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

Самый простой способ, вероятно, возвращая CURSOR:

 
SQL> VAR cr_dual REFCURSOR 

SQL> BEGIN 
    2   OPEN :cr_dual FOR 
    3   SELECT 1 
    4   FROM dual 
    5   UNION ALL 
    6   SELECT 2 
    7   FROM dual; 
    8 END; 
    9/

Процедура PL/SQL успешно завершена. 

SQL> PRINT cr_dual 

     1 
---------- 
     1 
     2 
0

если вы получаете только одну запись, и вы знаете, определение записи, вы должны быть в состоянии области записи непосредственно по имени.

, например:

TYPE myrecord IS RECORD (
     itemA NUMBER, 
     itemB myTable.columnName%TYPE 
); 

, когда у вас есть запись типа MyRecord, вы можете ссылаться на Itema таким образом, как это:

CREATE OR REPLACE FUNCTION myFunction(theRecord IN myrecord%TYPE) RETURN NUMBER 
IS 
BEGIN  
    RETURN recordInstance.itemA; 
END myFunction; 

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

+0

Это будет отлично работать, если мне нужна только одна часть записи, но мне нужно несколько частей записи. Процедура возвращает запись почтового адреса, так что она содержит несколько переменных. Город, Почтовый индекс, Номер улицы, название улицы, уличный суффикс. И еще несколько других.Я надеялся записать отчет на стол, поэтому я мог бы выбрать его в инструкции sql вместо того, чтобы менять код из 40 наших приложений, использующих адресацию. – Slowbie

+0

@Slowbie, я вижу. сколько полей вы надеетесь вернуть, или вам нужен конкатенированный varchar адреса? я думаю, было бы хорошо видеть, что вы хотите, как возвращаемое значение из вашей функции. – akf

0

Вы можете попробовать varray.

Первый -

create or replace type addr_type 
as object 
(name varchar2(20) 
,city varchar2(20) 
) 

И создать VARRAY в

create or replace type varr_addr as varray(10) of addr_type 
/

Теперь вы можете вернуть работу с varr_addr. Пример:

SQL> create or replace procedure ret_user_addr (p_out out varr_addr) 
    2 is 
    3 begin 
    4 p_out := varr_addr(addr_type('NAME1','CITY1'),addr_type('NAME2','CITY2')); 
    5 end; 
    6/

Procedure created. 

SQL> sho err 
No errors. 

Теперь вам нужно иметь переменную из правильно сконфигурированный, где вы call.And вы можете выбрать из таблицы (VARIABLE_NAME), как вы могли бы сделать.

3

RECORD - концепция PL/SQL. Поэтому мы не можем создать TABLE TYPE на основе RECORD и использовать этот TYPE в инструкции SQL. SQL только распознает TYPE, которые создаются в SQL.

Итак, если я правильно понял ваш сценарий, вам нужно создать объект и/или вложенную таблицу в SQL. Затем ваша функция может вызвать процедуру и перевести RECORD во вложенную таблицу. Затем вложенную таблицу можно вернуть или конвейерно.

1

В результате этой проблемы было создано представление на основе логики хранимой процедуры и запроса непосредственно из нее.

Смежные вопросы