使用 between to_date Oracle sqlplus 时创建分隔字段

Create a delimited field when using a between to_date Oracle sqlplus

我正在使用查询创建一个 csv 文件!作为分隔符(我没有创建查询,也无法修改分隔符)。

我必须修改 select 语句以使用 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 column1
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 column1
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 之间分隔为一列?

您丢失了 v_datev_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 column1
FROM
 mytable
where
column1= TO_DATE('2011-12-13','yyyy-mm-dd')

你的修改为:

SELECT column1
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 column1
FROM
 mytable
where
 column1 BETWEEN TO_DATE('2011-12-13','yyyy-mm-dd')
        AND TO_DATE( '2012-01-02','yyyy-mm-dd')

哪个看起来更合理


希望那些 v_* 变量是字符串。如果它们是日期,那么您不应该依赖 NLS 会话将它们转换为日期。无论哪种方式,您都应该使用绑定变量,然后在执行动态查询时提供实际值 - 尽管为什么这是动态的并不明显,所以也许构建的查询被传回其他东西给 运行 .