﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Oracle / Базы данных  / Возврат функцией набора записей / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://www.relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Sat, 22 Nov 2008 03:34:37 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Возврат функцией набора записей</title><link>http://www.relib.com/forums/Topic740571-21-1.aspx</link><description>У вас аська или мыло есть? Давай туда...</description><pubDate>Mon, 04 Feb 2002 14:58:00 GMT</pubDate><dc:creator>VVP</dc:creator></item><item><title>RE: Возврат функцией набора записей</title><link>http://www.relib.com/forums/Topic740571-21-1.aspx</link><description>Спасибо!&lt;BR&gt;Прошу прощения, что настырничаю с вопросами, но время жмет и тактичность &amp;quot;перегружается&amp;quot; необходимостью. &lt;BR&gt;Что-то с этими функциями прямо беда.&lt;BR&gt;1. Не получается внутри package (впрочем и standalone функцией) обратиться к функции:&lt;BR&gt;create or replace package PAK is&lt;BR&gt;  type recordset is ref cursor;&lt;BR&gt;  function F1(VAR number) return tbl_type;&lt;BR&gt;  function F2 (VAR number) return recordset;&lt;BR&gt;end;&lt;BR&gt;&lt;BR&gt;create or replace package body PAK as&lt;BR&gt;  function F1(VAR) return tbl_type is&lt;BR&gt;    ...&lt;BR&gt;  end;&lt;BR&gt;  function F2 (VAR) return recordset is&lt;BR&gt;  rst recorset;&lt;BR&gt;  begin&lt;BR&gt;    open rst for&lt;BR&gt;      select t.fld1,...&lt;BR&gt;      from table([PAK.]F1(VAR)) -- что с префиксом PAK, что без него&lt;BR&gt;    return rst;&lt;BR&gt;  rnd;&lt;BR&gt;&lt;BR&gt;пишет:&lt;BR&gt;PLS-00225: subprogram or cursor '[PAK.]F1' reference is out of scope&lt;BR&gt;&lt;BR&gt;Возможно я не то горожу, но проблема в том, что нужно присвоить набор записей, возвращаемых функцией PL/SQL, ADOBDRecorset MS Visual Stidio?&lt;BR&gt;и в связи с этим вопросы:&lt;BR&gt;&lt;BR&gt;2. MS Visual Studio:&lt;BR&gt;- КАК ВЫЗВАТЬ ИЗ ИЗ ПРИЛОЖЕНИЯ MS VS ФУНКЦИЮ И ПЕРЕДАТЬ/ПОЛУЧИТЬ ДАННЫЕ (бьемся второй день ничего не выходит)&lt;BR&gt;- во-первых, видит перегружаемые функции раздельно (какой тогда смысл перегрузки?), а в Object View функции packag-а вообще не видит &lt;BR&gt;- не получается получить значения в приложение MS VS у функции PL/SQL с возвращаемым типом table type&lt;BR&gt;- какие типы возвращаемых параметров можно присвоить ADODBRecorset (table type, cursor, pipelined)?&lt;BR&gt;&lt;BR&gt;3. Можно ли вернуть из pipelined функции курсор?&lt;BR&gt;&lt;BR&gt;Весьма признателен.</description><pubDate>Mon, 04 Feb 2002 14:35:00 GMT</pubDate><dc:creator>engineer</dc:creator></item><item><title>RE: Возврат функцией набора записей</title><link>http://www.relib.com/forums/Topic740571-21-1.aspx</link><description>Для начала вот тебе ссылочка: http://otn.oracle.com/docs/products/oracle8i/content.html/&lt;BR&gt;Там расписано про 8i сервак, а PL/SQL он и африке пиэльсиквел.&lt;BR&gt;Вот тебе еще ссылка про PL/SQL: http://otn.oracle.com/docs/products/oracle8i/doc_library/817_doc/appdev.817/a77069/toc.htm - читай там.&lt;BR&gt;&lt;BR&gt;Теперь про курсор, открытый в ф-ции FUNC, вот одно из правильных обращений к нему из PL/SQL:&lt;BR&gt;[code]&lt;BR&gt;declare&lt;BR&gt;  ID number := 12;&lt;BR&gt;  VC PKG_FUNC.RECORDSET;&lt;BR&gt;  V_EMPL EMPL%rowtype;&lt;BR&gt;begin&lt;BR&gt;  VC:=PKG_FUNC.FUNC(ID);&lt;BR&gt;  loop &lt;BR&gt;    fetch VC into V_EMPL;&lt;BR&gt;    exit when V_EMPL%notfound;&lt;BR&gt;    dbms_output.put_line(V_EMPL.NAME||' '||V_EMPL.SURNAME);&lt;BR&gt;  end loop;&lt;BR&gt;  close VC;&lt;BR&gt;end;&lt;BR&gt;[/code]&lt;BR&gt;&lt;BR&gt;Ладно я побежал, по русски только книги :-(</description><pubDate>Fri, 01 Feb 2002 17:58:00 GMT</pubDate><dc:creator>VVP</dc:creator></item><item><title>RE: Возврат функцией набора записей</title><link>http://www.relib.com/forums/Topic740571-21-1.aspx</link><description>Спасибо VVP за подробный ответ!&lt;BR&gt;Задача такая.&lt;BR&gt;Записи одной таблицы связаны друг с другом связью многие-ко-многим через таблицу пересечений. Не буду углубляться в предметику.&lt;BR&gt;На основе этого строится несимметричное дерево.&lt;BR&gt;Функция на выходе должна выдавать в наборе еще служебное поле, которое означает наличие связанных подчиненных строк для выбранной записи - это значит еще один курсор (жаль, if exists не работает в if - по-крайней мере так отвечает).&lt;BR&gt;По-поводу динамического SQL - абсолютно правильно. Я думал, может есть возможность как-то сработать указателями. Дело в том, что эта конструкция типовая и повторяется в схеме БД несколько раз, но ничего страшного - повешу на IF, хотя это менее эффективно.&lt;BR&gt;&lt;BR&gt;Больше всего проблем возникает при считывании данных из функций:&lt;BR&gt;Если запустить &lt;BR&gt;select *&lt;BR&gt;from PKG_FUNC.FUNC();&lt;BR&gt;выдает&lt;BR&gt;PLS-00103: Encountered the symbol &amp;quot;(&amp;quot; when expecting one of the following:  &lt;BR&gt;. into bulk&lt;BR&gt;&lt;BR&gt;Если пустить курсор:&lt;BR&gt;&lt;BR&gt;declare&lt;BR&gt;rst recordset%rowtype;--recordset - то же тип, что возвращает FUNC&lt;BR&gt;type cur is ref cursor return recordset%rowtype;&lt;BR&gt;c cur;&lt;BR&gt;begin&lt;BR&gt; open c for&lt;BR&gt; select * from table(PKG_FUNC.FUNC());&lt;BR&gt; fetch cur into rst;&lt;BR&gt;end;&lt;BR&gt;то&lt;BR&gt;PL/SQL: ORA-22905: cannot access rows from a non-nested table item&lt;BR&gt;&lt;BR&gt;функция f(), которая возвращает тип table type&lt;BR&gt;операцией&lt;BR&gt;select *&lt;BR&gt;from f();&lt;BR&gt;возвращает пустые строки.&lt;BR&gt;в тоде читаю курором, но разработчики клиентов не знают как к ней подобраться.&lt;BR&gt;&lt;BR&gt;и т.п. и т.д.&lt;BR&gt;&lt;BR&gt;читал в документации, что как-то применяют типы SYS.ANYTYPE, SYS.ANYDATASET, но это связано с применением DBMS_OUTPUT - до этого еще не добрался - читаю с компа с ораклового сайта,&lt;BR&gt;(ссылка на всякий: http://download-east.oracle.com/otndoc/oracle9i/901_doc/appdev.901/a89856/toc.htm)&lt;BR&gt;Не знаешь, где найти в сети такую же документацию на русском?&lt;BR&gt;&lt;BR&gt;Спасибо!</description><pubDate>Fri, 01 Feb 2002 16:11:00 GMT</pubDate><dc:creator>engineer</dc:creator></item><item><title>RE: Возврат функцией набора записей</title><link>http://www.relib.com/forums/Topic740571-21-1.aspx</link><description>create or replace package PKG_FUNC is&lt;BR&gt;&lt;BR&gt;type RECORDSET is ref cursor; -- это тип результата&lt;BR&gt;&lt;BR&gt;function FUNC(ID in number) return RECORDSET; -- эта ф-ция возвращает курсор, из которого фетчишь данные.&lt;BR&gt;&lt;BR&gt;end; -- end of package&lt;BR&gt;&lt;BR&gt;create or replace package body PKG_FUNC is&lt;BR&gt;&lt;BR&gt;function FUNC(ID in number) return RECORDSET is&lt;BR&gt;  VC RECORDSET;&lt;BR&gt;begin&lt;BR&gt;  open VC from select * from EMPL where DEPT_ID=ID;&lt;BR&gt;  return VC;&lt;BR&gt;end;&lt;BR&gt;&lt;BR&gt;end; -- end of package body&lt;BR&gt;&lt;BR&gt;Тип объявлять обязан.&lt;BR&gt;Теперь по поводу передачи имен двух таблиц и имен колонок - это тебе придется делать динамический PL/SQL, что тормознуто и вряд-ли оправдано.&lt;BR&gt;Возможно постановка задачи несколько другая - если подробнее расскажешь, то попытаюсь помочь.</description><pubDate>Fri, 01 Feb 2002 11:56:00 GMT</pubDate><dc:creator>VVP</dc:creator></item><item><title>Возврат функцией набора записей</title><link>http://www.relib.com/forums/Topic740571-21-1.aspx</link><description>Может вопросы слишком простые - изучаю Oracle только неделю.&lt;BR&gt;Но время жмет - кто знает помогите, если возможно, сразу кодом.&lt;BR&gt;В целом задача формулируется так (может кто знает ответ целиком):&lt;BR&gt;Нужна функция, которая будет получать имена двух таблиц, имя ключевого поля в одной таблице, его значение, имена первичного и внешнего ключей (по которому связывается с первой) и имя текстового поля - во второй и возвращать набор записей, которые можно обработать ADODB.Recordset и состоящий из первичного ключа и текстового поля второй таблицы.&lt;BR&gt;&lt;BR&gt;1.Как получить набор записей из функции, желательно такой, который может быть обработан ADODB.Recordset?&lt;BR&gt;2.Как полученный набор можно присвоить переменной типа table type или какой-либо еще?&lt;BR&gt;&lt;BR&gt;Спасибо!</description><pubDate>Thu, 31 Jan 2002 17:22:00 GMT</pubDate><dc:creator>engineer</dc:creator></item></channel></rss>