我做了这个陈述,没关系
SELECT a, b
FROM T_COMMENTS
WHERE DATE_COMMENTS BETWEEN DATE '2014-12-05' AND DATE '2017-05-16'
但是我想创建一个存储过程并且有一个错误:
CREATE OR REPLACE PROCEDURE FACEBOOK.PR_SEL_ALL_COM_PH
(CONSULTA OUT SYS_REFCURSOR,COD_US INT,INDATE1 IN VARCHAR2, INDATE2 IN VARCHAR2) IS
BEGIN
OPEN CONSULTA FOR SELECT a,b FROM T_COMMENTS WHERE DATE_COMMENTS BETWEEN DATE INDATE1 AND DATE INDATE2;
END;
/
我的存储过程会出现什么问题,提前谢谢。 更新1: 我正在使用php。当我为indate1推送日期时,indate2出现此异常
Warning: oci_execute() [function.oci-execute]: ORA-01861: literal does not match format string
我该如何解决?提前谢谢。
答案 0 :(得分:3)
将日期作为日期传递:
idUsera l_reze
516287 8
2495710 6
2195860 6
645233 5
98308 5
543007 5
1464142 5
3461665 5
3443141 5
3818844 4
2305130 4
如果出于某种原因你绝对必须将它们作为字符串传递,你需要使用create or replace procedure facebook.pr_sel_all_com_ph
( consulta out sys_refcursor
, cod_us int
, indate1 in date
, indate2 in date )
is
begin
open consulta for
select a,b
from t_comments
where date_comments between indate1 and indate2;
end;
/
将它们转换为过程中的实际日期,尽管这当然会为你的程序提供一个额外的验证任务。 (调用者将如何知道要使用哪种格式?如果他们以错误的格式传递它们怎么办?在执行查询之前,程序应该检查多少格式?等等。这是一个巨大的痛苦而不是程序的工作。 )
to_date(indate1,'YYYY-MM-DD')
失败的原因是日期文字仅适用于文字引用文本,而不适用于变量。