以下是示例程序代码
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之间是否足够或我需要屏蔽日期格式?
有人可以帮我澄清一下吗?
答案 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
命名空间变量允许您保持一个没有前缀的更干净的界面。