Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 使用ref-cusor中的日期或pl/sql_Date_Plsql_Oracle11g - Fatal编程技术网

Date 使用ref-cusor中的日期或pl/sql

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;

我有一个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;
     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);
当然,如果您的表中没有匹配的日期,或者有多个匹配的日期,那么这将是错误的,并且您需要处理这个问题,但是我想您无论如何都会想这样做