如何在oracle程序中传递日期参数?

时间:2015-11-26 07:19:35

标签: sql oracle

以下是示例程序代码

create or replace procedure pro_test(start_date date, end_date date)
is 
begin

insert into test1 select col1, col2, col3 from main where range_date between start_date and end_date;

exception

< what are the exception I need to capture >

end;
/

Q1:这是直接在程序中传递日期的正确方法吗? Q2:如果没有,我可以在程序中传递varchar,来转换声明部分中的日期吗? Q3:在运营商之间开始部分使用,我可以直接通过程序参数吗?

在执行此程序时,exec pro_test('10102015','30102015');在句子之间我需要提及什么? start_date和end_date之间是否足够或我需要屏蔽日期格式?

有人可以帮我澄清一下吗?

3 个答案:

答案 0 :(得分:7)

  

Q1:这是直接在程序中传递日期的正确方法吗?

  

Q3:在运营商之间开始部分使用,我可以直接传递程序参数吗?

不确定这是什么意思,但你的插入声明没问题。您正在传递 DATE 作为参数并插入表格。

在我看来,所有这些都可以在纯 SQL 中的单个 INSERT..SELECT 语句中完成。

insert into test1 
select col1, col2, col3 
from main 
where range_date 
between TO_DATE(<date_literal>,<format mask>)
and TO_DATE(<date_literal>,<format mask>);

更新每个OP的评论:

  

执行此程序时,exec pro_test(&#39; 10102015&#39;,&#39; 30102015&#39;);   在句子之间我需要提到什么?在start_date和。之间   end_date这个还是我需要屏蔽日期格式?

'10102015'不是DATE,它是一个字符串文字。您必须将其作为日期传递,因此您必须使用带有正确格式掩码的 TO_DATE ANSI Date literal ,因为您没有任何时间部分。 ANSI Date literal使用固定格式'YYYY-MM-DD'

例如,

使用 TO_DATE

EXEC pro_test(TO_DATE('10102015','DDMMYYYY'),TO_DATE('30102015','DDMMYYYY'));

使用 ANSI Date literal

EXEC pro_test(DATE '2015-10-10', DATE '2015-10-30');

答案 1 :(得分:2)

Q1。您需要说明什么类型的参数输入输出(添加 out ),为您的程序输入:

create or replace procedure pro_test(start_date in date, end_date in date)

你手术中的其他所有内容都很好。

答案 2 :(得分:2)

如果您需要格外谨慎,则应在pl / sql变量用于SQL语句时对其进行命名空间:

create or replace procedure pro_test(start_date date, end_date date)
is 
begin

  insert into test1
  select col1, col2, col3
  from main where range_date
  between pro_test.start_date and pro_test.end_date;
...

这可以防止SQL引擎“捕获”变量,如果它们的名称与引用表中的列相同。

通常你会看到人们试图避免这种情况:

create procedure my_procedure (p_customer_id number)
...
where customer_id = p_customer_id

命名空间变量允许您保持一个没有前缀的更干净的界面。