如何解决“无效标识符”-立即执行

时间:2019-09-26 14:52:24

标签: sql oracle plsql

我必须在代码中运行动态查询;该字符串是一个使用我的“归档”函数的输入参数的选择:我必须选择表中具有该函数输入i之前的失效日期的记录。 没有编译错误,但是当我尝试执行它时,我发现了错误

  

ORA-00904:“ FEB”:无效的标识符。

我已经完成

execute archivia_('4-02-2000','data_prestito','prestiti','scadenza');

将日期类型值链接到字符串中的正确方法是什么?将其转换为char是否正确? 有人可以帮我吗?

create or replace procedure archivia_(p_data varchar,select_arg varchar, 
   tabella varchar,colonna varchar) as

conv_data varchar(50):= to_date(p_data,'dd/mm/yyyy');

str_sql varchar(200) := 'select '||select_arg||' from ' || tabella || ' where ' || colonna || ' < ' || to_char(conv_data);

data_prestito date;
saldo int:= 0;

begin 

    execute immediate str_sql into data_prestito;
    dbms_output.put_line(data_prestito);
end;

2 个答案:

答案 0 :(得分:1)

使用DATE值的设计很糟糕。正确的设计应该是这样的:

create or replace procedure archivia_(p_data DATE,select_arg varchar, 
   tabella varchar,colonna varchar) as

str_sql varchar(200) := 
   'select '||select_arg||' from ' || tabella || ' where ' || colonna || ' < :cData';

data_prestito date;
saldo int:= 0;

begin 

    execute immediate str_sql into data_prestito USING p_data;
    dbms_output.put_line(data_prestito);
end;

execute archivia_(DATE '2000-02-04','data_prestito','prestiti','scadenza');
or
execute archivia_(TO_DATE('4-02-2000', 'mm-dd-yyyy'),'data_prestito','prestiti','scadenza');

答案 1 :(得分:0)

正如Wernfried Domscheit所建议的那样,理想的设计应该按照他的回答。

如果您被限制为不更改过程,并且希望以字符串格式传递日期,那么请确保传递的日期以及将字符串转换为日期的公式使用相同的日期格式。 / p>

因此在调用过程时传递日期如下:

execute archivia_('04/02/2000','data_prestito','prestiti','scadenza');

干杯!