我是Oracle的新手,对存储过程的输入参数有疑问。基本上它是从外部系统调用的存储过程,传递格式为MM / DD / YYYY的日期。
Oracle似乎不喜欢MM / DD / YYYY格式,因为它给了我一个"而不是一个有效的月份"错误。 (我认为它想要一个DD-MMM-YYYY?)无论默认是什么。
有没有办法在日期进入过程中转换日期而不会出错?
如:
create procedure test_proc
(
v_input_date IN DATE := to_char(v_input_date, 'MM/DD/YYYY')
)
我知道上面的代码可能没有实际意义,但希望它能传达我想做的事情。用户可以调用类似
的过程BEGIN
test_proc('01/01/2018')
END
答案 0 :(得分:1)
您可以尝试ANSI类型date 'yyyy-mm-dd'
格式,如下例所示:
SQL>create or replace procedure test_proc( v_input_date date ) is
v_diff int;
begin
v_diff := trunc(sysdate)-v_input_date;
dbms_output.put_line(v_diff||' days difference...');
end;
/
SQL> set serveroutput on;
SQL> begin
test_proc(date '2018-03-21');
end;
/
2 days difference...
答案 1 :(得分:1)
您的问题不在程序中,而是在调用程序的代码中。
// layout
private void InitializeComponent(){
// Make contentview background red for debugging purposes
this.BackgroundColor = Color.Red;
this.VerticalOptions = LayoutOptions.Start;
//The actual notification should be green
MainStackLayout = new StackLayout{
Orientation = StackOrientation.Horizontal,
VerticalOptions = LayoutOptions.Start,
BackgroundColor = Color.Green
};
var title = new Label{
Text = "Hello There"
};
var msg = new Label{
Text = "Importaint stuff you should be aware of"
};
var btn = new Button{
Text = "X",
VerticalOptions = LayoutOptions.Start,
HorizontalOptions = LayoutOptions.EndAndExpand,
BorderColor = Color.Transparent,
BackgroundColor = Color.Transparent,
HeightRequest = 40,
WidthRequest = 40,
Margin = 3
};
btn.Clicked += OnDismissClicked;
var textStack = new StackLayout();
textStack.Children.Add(title);
textStack.Children.Add(msg);
MainStackLayout.Children.Add(textStack);
MainStackLayout.Children.Add(btn);
Content = MainStackLayout;
// Default visibility is hidden
IsVisible = false;
}
不是一个字符串的日期,但您的程序需要一个日期;但是,Oracle会尝试提供帮助,并会隐式尝试使用'01/01/2018'
函数将字符串转换为日期。由于它没有指定的格式模型,因此它将使用日期的默认格式NLS_DATE_FORMAT
session parameter,如果此格式掩码与字符串的格式不匹配,则会出现错误。
(注意:会话参数是每用户会话,并且可以由每个用户更改,因此您不应该依赖它们对于每个用户是相同的,甚至对同一用户的会话之间也是如此!)
您可以使用查询查看TO_DATE( string_value, format_model )
会话参数的格式:
NLS_DATE_FORMAT
调用该过程的代码隐式转换为:
SELECT VALUE
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
要生成日期,您应该通过以下方式将字符串显式转换为日期:
BEGIN
test_proc(
TO_DATE(
'01/01/2018',
( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
)
);
END;
或specifying the format mask used in the conversion
BEGIN
test_proc( DATE '2018-01-01' );
END;