функция оракула для возврата списка дат в виде объекта - PullRequest
1 голос
/ 02 декабря 2010

Кому это может ответить,

Я пытаюсь вернуть список дат и дней недели для использования в других функциях. Код ниже скомпилирован без ошибок. Но он должен давать 15 дней (через переменную V_MAX_DAYS) и номер дня в этой неделе.

Я пытался реализовать таким образом, но не могу получить вывод с использованием DBMS_OUTPUT. Я хочу проверить это, но получил ошибку ORA-06532 при запуске. Моя цель - вернуть значения в приложение asp.net, как мы это сделали, используя SYS_REFCURSOR. Как я могу этого достичь? Спасибо за беспокойство,

Сценарий выглядит так:

CREATE OR REPLACE TYPE DATE_ROW AS OBJECT
(
  WEEKDAY_VALUE DATE,
  DATE_IN_LIST VARCHAR2(5)
)
/

CREATE OR REPLACE TYPE DATE_TABLE as table of DATE_ROW
/



CREATE OR REPLACE FUNCTION FN_LISTDATES
   RETURN DATE_TABLE
IS
   V_DATE_TABLE        DATE_TABLE    := DATE_TABLE ();
   V_MAX_DAYS          NUMBER        := 15;
   V_CALCULATED_DATE   DATE;
   V_WEEKDAY           VARCHAR2 (5);
BEGIN
   FOR X IN -2 .. V_MAX_DAYS
   LOOP
      SELECT TO_DATE (TO_CHAR (SYSDATE + X, 'DD.MM.YYYY'))
        INTO V_CALCULATED_DATE
        FROM DUAL;
      V_DATE_TABLE.EXTEND;
      V_DATE_TABLE(X) := DATE_ROW(V_CALCULATED_DATE, 'Test');
   END LOOP;
   RETURN V_DATE_TABLE;
END;
/

1 Ответ

4 голосов
/ 02 декабря 2010

Несколько баллов.

  1. Если вы хотите ДАТУ (V_CALCULATED_DATE), которая составляет X дней от SYSDATE с компонентом времени, установленным на полночь, что, по-видимому, является вашим намерением, вам нужно что-то вроде v_calculated_date := TRUNC(sysdate) + x;. TO_DATE без явной маски формата создаст проблемы, если NLS_DATE_FORMAT будущего сеанса не будет DD.MM.YYYY
  2. Если вы действительно хотите вернуть такую ​​коллекцию, индексы вашей коллекции должны начинаться с 1, а не с -2. Вы могли бы сделать это, выполнив v_date_table(x+3) := DATE_ROW(v_calculated_date, 'Test');.
  3. Тем не менее, я склонен подозревать, что вам будет лучше обслужен с конвейерной табличной функцией.

Функция конвейерной таблицы будет выглядеть примерно так:

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE FUNCTION FN_LISTDATES
  2     RETURN DATE_TABLE
  3     PIPELINED
  4  IS
  5     V_MAX_DAYS          NUMBER        := 15;
  6     V_CALCULATED_DATE   DATE;
  7     V_WEEKDAY           VARCHAR2 (5);
  8  BEGIN
  9     FOR X IN -2 .. V_MAX_DAYS
 10     LOOP
 11        v_calculated_date := trunc(sysdate) + x;
 12        PIPE ROW( DATE_ROW(v_calculated_date,'Test') );
 13     END LOOP;
 14     RETURN;
 15* END;
SQL> /

Function created.

SQL> select * from table( fn_listDates );

WEEKDAY_V DATE_
--------- -----
30-NOV-10 Test
01-DEC-10 Test
02-DEC-10 Test
03-DEC-10 Test
04-DEC-10 Test
05-DEC-10 Test
06-DEC-10 Test
07-DEC-10 Test
08-DEC-10 Test
09-DEC-10 Test
10-DEC-10 Test

WEEKDAY_V DATE_
--------- -----
11-DEC-10 Test
12-DEC-10 Test
13-DEC-10 Test
14-DEC-10 Test
15-DEC-10 Test
16-DEC-10 Test
17-DEC-10 Test

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