如何在存储过程和语句之间传递日期参数?

时间:2017-05-31 18:12:00

标签: php plsql

我做了这个陈述,没关系

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

我该如何解决?提前谢谢。

1 个答案:

答案 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')失败的原因是日期文字仅适用于文字引用文本,而不适用于变量。