Date 使用ref-cusor中的日期或pl/sql
我有一个var:acc_date,类型为date 它从游标获取其值,当我将其值插入logger表时,如下所示:Date 使用ref-cusor中的日期或pl/sql,date,plsql,oracle11g,Date,Plsql,Oracle11g,我有一个var:acc_date,类型为date 它从游标获取其值,当我将其值插入logger表时,如下所示: insert into logger values(1,acc_date); 从记录器中选择时的输出为 1 01-JAN-10 但当我使用它与另一个游标中的另一个日期值进行比较时 OPEN c_get_date_id for 'SELECT Date_D.DATEKEY from Date_D where Date_D.DATEVALUE='||acc_date;
insert into logger values(1,acc_date);
从记录器中选择时的输出为
1 01-JAN-10
但当我使用它与另一个游标中的另一个日期值进行比较时
OPEN c_get_date_id
for 'SELECT Date_D.DATEKEY from Date_D where Date_D.DATEVALUE='||acc_date;
EXIT WHEN c_get_date_id%NOTFOUND;
FETCH c_get_date_id
INTO date_id;
insert into logger values (1,'Now with date_id'||date_id);
CLOSE c_get_date_id;
出现以下错误:
Error report:
ORA-00904: "JAN": invalid identifier
ORA-06512: at "HW.FILLFACT", line 82
ORA-06512: at line 1
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
strong文本您至少需要在日期周围添加一些引号:
....' where Date_D.DATEVALUE='''||acc_date||'''';
字符串中的双撇号将连接到一个单撇号,以便表达式成为
where Date_D.DATEVALUE='....';
为了让事情变得更简单,我还要在日期中添加一个特定的:
.... ' where Date_D.DATEVALUE=to_date(''' || acc_date || ', ''dd-mon-yy'')';
您至少需要在日期前后添加一些引号:
....' where Date_D.DATEVALUE='''||acc_date||'''';
字符串中的双撇号将连接到一个单撇号,以便表达式成为
where Date_D.DATEVALUE='....';
为了让事情变得更简单,我还要在日期中添加一个特定的:
.... ' where Date_D.DATEVALUE=to_date(''' || acc_date || ', ''dd-mon-yy'')';
您至少需要在日期前后添加一些引号:
....' where Date_D.DATEVALUE='''||acc_date||'''';
字符串中的双撇号将连接到一个单撇号,以便表达式成为
where Date_D.DATEVALUE='....';
为了让事情变得更简单,我还要在日期中添加一个特定的:
.... ' where Date_D.DATEVALUE=to_date(''' || acc_date || ', ''dd-mon-yy'')';
您至少需要在日期前后添加一些引号:
....' where Date_D.DATEVALUE='''||acc_date||'''';
字符串中的双撇号将连接到一个单撇号,以便表达式成为
where Date_D.DATEVALUE='....';
为了让事情变得更简单,我还要在日期中添加一个特定的:
.... ' where Date_D.DATEVALUE=to_date(''' || acc_date || ', ''dd-mon-yy'')';
目前,您的动态查询被解释为:
SELECT Date_D.DATEKEY from Date_D where Date_D.DATEVALUE=01-JAN-10
错误是因为没有引用日期的字符串表示形式,因此它将JAN
视为标识符,并且没有任何内容与该名称匹配。可以将日期值括在引号中:
open c_get_date_id
for 'SELECT Date_D.DATEKEY from Date_D where Date_D.DATEVALUE='''||acc_date||'''';
但您将日期视为字符串,并使用会话的NLS_date_格式强制将所有表值转换为要比较的字符串。最好将其作为日期进行比较(尽管这在某种程度上假设所有值的时间部分都设置为午夜):
但是,您的出口位置错误,并且您没有循环,因此您可能希望:
open c_get_date_id
for select date_d.datekey from date_d where date_d.datevalue = acc_date;
loop
fetch c_get_date_id into date_id;
exit when c_get_date_id%notfound;
insert into logger values (1, 'Now with date_id'||date_id);
end loop;
close c_get_date_id;
如果您在第一个位置只有一个值,那么您可能根本不需要循环或游标,可以执行一个简单的select。。。改为进入
:
select date_d.datekey into date_id from date_d
where date_d.datevalue = acc_date;
insert into logger values (1, 'Now with date_id'||date_id);
当然,如果您的表中没有匹配的日期,或者有多个匹配的日期,那么这将是错误的,您需要处理这个问题,但我想您无论如何都会想这样做。此时,您的动态查询被解释为:
SELECT Date_D.DATEKEY from Date_D where Date_D.DATEVALUE=01-JAN-10
错误是因为没有引用日期的字符串表示形式,因此它将JAN
视为标识符,并且没有任何内容与该名称匹配。可以将日期值括在引号中:
open c_get_date_id
for 'SELECT Date_D.DATEKEY from Date_D where Date_D.DATEVALUE='''||acc_date||'''';
但您将日期视为字符串,并使用会话的NLS_date_格式强制将所有表值转换为要比较的字符串。最好将其作为日期进行比较(尽管这在某种程度上假设所有值的时间部分都设置为午夜):
但是,您的出口位置错误,并且您没有循环,因此您可能希望:
open c_get_date_id
for select date_d.datekey from date_d where date_d.datevalue = acc_date;
loop
fetch c_get_date_id into date_id;
exit when c_get_date_id%notfound;
insert into logger values (1, 'Now with date_id'||date_id);
end loop;
close c_get_date_id;
如果您在第一个位置只有一个值,那么您可能根本不需要循环或游标,可以执行一个简单的select。。。改为进入
:
select date_d.datekey into date_id from date_d
where date_d.datevalue = acc_date;
insert into logger values (1, 'Now with date_id'||date_id);
当然,如果您的表中没有匹配的日期,或者有多个匹配的日期,那么这将是错误的,您需要处理这个问题,但我想您无论如何都会想这样做。此时,您的动态查询被解释为:
SELECT Date_D.DATEKEY from Date_D where Date_D.DATEVALUE=01-JAN-10
错误是因为没有引用日期的字符串表示形式,因此它将JAN
视为标识符,并且没有任何内容与该名称匹配。可以将日期值括在引号中:
open c_get_date_id
for 'SELECT Date_D.DATEKEY from Date_D where Date_D.DATEVALUE='''||acc_date||'''';
但您将日期视为字符串,并使用会话的NLS_date_格式强制将所有表值转换为要比较的字符串。最好将其作为日期进行比较(尽管这在某种程度上假设所有值的时间部分都设置为午夜):
但是,您的出口位置错误,并且您没有循环,因此您可能希望:
open c_get_date_id
for select date_d.datekey from date_d where date_d.datevalue = acc_date;
loop
fetch c_get_date_id into date_id;
exit when c_get_date_id%notfound;
insert into logger values (1, 'Now with date_id'||date_id);
end loop;
close c_get_date_id;
如果您在第一个位置只有一个值,那么您可能根本不需要循环或游标,可以执行一个简单的select。。。改为进入
:
select date_d.datekey into date_id from date_d
where date_d.datevalue = acc_date;
insert into logger values (1, 'Now with date_id'||date_id);
当然,如果您的表中没有匹配的日期,或者有多个匹配的日期,那么这将是错误的,您需要处理这个问题,但我想您无论如何都会想这样做。此时,您的动态查询被解释为:
SELECT Date_D.DATEKEY from Date_D where Date_D.DATEVALUE=01-JAN-10
错误是因为没有引用日期的字符串表示形式,因此它将JAN
视为标识符,并且没有任何内容与该名称匹配。可以将日期值括在引号中:
open c_get_date_id
for 'SELECT Date_D.DATEKEY from Date_D where Date_D.DATEVALUE='''||acc_date||'''';
但您将日期视为字符串,并使用会话的NLS_date_格式强制将所有表值转换为要比较的字符串。最好将其作为日期进行比较(尽管这在某种程度上假设所有值的时间部分都设置为午夜):
但是,您的出口位置错误,并且您没有循环,因此您可能希望:
open c_get_date_id
for select date_d.datekey from date_d where date_d.datevalue = acc_date;
loop
fetch c_get_date_id into date_id;
exit when c_get_date_id%notfound;
insert into logger values (1, 'Now with date_id'||date_id);
end loop;
close c_get_date_id;
如果您在第一个位置只有一个值,那么您可能根本不需要循环或游标,可以执行一个简单的select。。。改为进入
:
select date_d.datekey into date_id from date_d
where date_d.datevalue = acc_date;
insert into logger values (1, 'Now with date_id'||date_id);
当然,如果您的表中没有匹配的日期,或者有多个匹配的日期,那么这将是错误的,并且您需要处理这个问题,但是我想您无论如何都会想这样做