Создайте поле с разделителями при использовании to_date Oracle sqlplus - PullRequest
0 голосов
/ 30 марта 2020

Здравствуйте, я создаю CSV-файл из запроса, используя! в качестве разделителя (я не создал запрос и не могу изменить разделитель). Я должен изменить оператор выбора, чтобы использовать to_date, но моя процедура умирает. Запрос назначается переменной, которая затем передается в процедуру, которая используется для создания файла CSV. Я полагаю, что ошибка происходит, потому что я разграничиваю две даты, когда должен быть только один столбец дат

Это оригинальный код, который работает с использованием одной даты

CREATE OR REPLACE PROCEDURE my_procedure(

    p_column1       IN               VARCHAR2
    ,p_column2   IN               VARCHAR2
)AS

v_query   VARCHAR2(5000);
v_column1 VARCHAR2(10);
v_column2 VARCHAR2(10);


v_column1 := p_column1;
v_column2 := p_column2;

v_query := q'!
SELECT columm1
FROM
 mytable
where
column1= TO_DATE('!'
               || v_date
               || q'!','yyyy-mm-dd')!';
END;

Это код, который я сейчас пытаюсь использовать

CREATE OR REPLACE PROCEDURE my_procedure(

    p_column1       IN               VARCHAR2
    ,p_column2   IN               VARCHAR2
)AS
v_query   VARCHAR2(5000);
v_column1 VARCHAR2(10);
v_column2 VARCHAR2(10);


v_column1 := p_column1;
v_column2 := p_column2;

v_query := q'!
SELECT columm1
FROM
 mytable
where
 column1 BETWEEN TO_DATE('!' ||v_date || q'!,'yyyy-mm-dd')
        AND TO_DATE( '!' ||v_end_date || q'!,'yyyy-mm-dd')!';
END;

Как можно разделить to_date одним столбцом?

1 Ответ

0 голосов
/ 30 марта 2020

Вы потеряли закрывающую кавычку после значений v_date и v_end_date:

where
 column1 BETWEEN TO_DATE('!' ||v_date || q'!','yyyy-mm-dd')
--------------------------------------------^
        AND TO_DATE( '!' ||v_end_date || q'!','yyyy-mm-dd')!';
--------------------------------------------^

Вы можете отладить такие проблемы, выполнив:

dbms_output.put_line(v_query);

С помощью случайное значение даты, которое показывает ваш исходный запрос как:

SELECT columm1
FROM
 mytable
where
column1= TO_DATE('2011-12-13','yyyy-mm-dd')

, а ваш измененный как:

SELECT columm1
FROM
 mytable
where
 column1 BETWEEN TO_DATE('2011-12-13,'yyyy-mm-dd')
        AND TO_DATE( '2012-01-02,'yyyy-mm-dd')

, что делает пропущенные кавычки в обоих вызовах to_date() более очевидными, чем они во время строительства. (И попытка выполнить это приводит к ORA-00907: отсутствует правильная скобка.)

С моей модификацией, которая теперь выглядит так:

SELECT columm1
FROM
 mytable
where
 column1 BETWEEN TO_DATE('2011-12-13','yyyy-mm-dd')
        AND TO_DATE( '2012-01-02','yyyy-mm-dd')

, что выглядит более разумно.


Надеемся, что эти v_* переменные являются строками. Если это даты, то вам не следует полагаться на сеансы NLS для их преобразования в даты. В любом случае вам, вероятно, следует использовать переменные связыванияm, а затем указывать фактические значения при выполнении запроса Dynami c - хотя неясно, почему это Dynami c, поэтому, возможно, этот построенный запрос передается обратно для чего-то другого бежать.

...