使用 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_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 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 会话将它们转换为日期。无论哪种方式,您都应该使用绑定变量,然后在执行动态查询时提供实际值 - 尽管为什么这是动态的并不明显,所以也许构建的查询被传回其他东西给 运行 .
我正在使用查询创建一个 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_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 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 会话将它们转换为日期。无论哪种方式,您都应该使用绑定变量,然后在执行动态查询时提供实际值 - 尽管为什么这是动态的并不明显,所以也许构建的查询被传回其他东西给 运行 .