我使用 Oracle 12c 。我知道我的下一个问题并不新鲜,但我有点困惑,需要帮助。
我有以下SQL语句:
SELECT *
FROM TABLE_NAME
WHERE CREATE_DATE BETWEEN TO_DATE(FIRST_DATE, 'YYYY-MM-DD')
AND TO_DATE(SECOND_DATE , 'YYYY-MM-DD')
问题:
如何在存储过程中正确使用SELECT
请求?
该SQL语句返回多于1行,这意味着我需要使用游标吗?
如果表有15列,则需要设置所有列作为输出?
编辑:
CREATE OR REPLACE PROCEDURE PROCEDURE_NAME
(
FIRST_DATE IN VARCHAR2(10),
SECOND_DATE IN VARCHAR2(10)
)
AS
oracle_cursor SYS_REFCURSOR;
BEGIN
OPEN oracle_cursor FOR
SELECT *
FROM scheme_name.table_name
WHERE CREATE_DATE BETWEEN TO_DATE(FIRST_DATE, 'YYYY-MM-DD') AND TO_DATE(SECOND_DATE, 'YYYY-MM-DD');
DBMS_SQL.RETURN_RESULT(oracle_cursor);
END PROCEDURE_NAME;
答案 0 :(得分:2)
如何在存储过程中正确使用SELECT请求?
在存储过程中,您需要将查询的结果集分配给与投影匹配的一个或多个变量:
select << column >>, << column >>
into << variable >>, << variable >>
from table_name
....
该SQL语句返回多于1行,是否意味着我需要使用游标?
游标是处理游标的一种方法。尽管通常使用游标循环是更好的方法:
for r in ( SELECT *
FROM TABLE_NAME
WHERE CREATE_DATE BETWEEN TO_DATE(FIRST_DATE, 'YYYY-MM-DD')
AND TO_DATE(SECOND_DATE , 'YYYY-MM-DD')
) loop
使用BULK COLLECT填充集合变量是另一种方法:
select << column >>
bulk collect into << collection >>
from table_name
....
如果表有15列,作为输出我需要设置所有列?
您可以选择创建15个不同的变量。但是,如果查询的投影与表的投影(与select *
一致)可以使用%rowtype
构造来定义记录变量或集合:
declare
l_rec TABLE_NAME%rowtype; -- single row
type t_rec is table of TABLE_NAME%rowtype; -- multiple rows
l_recs t_rec
begin
SELECT *
bulk collect into l_recs
FROM TABLE_NAME
WHERE CREATE_DATE BETWEEN TO_DATE(FIRST_DATE, 'YYYY-MM-DD')
AND TO_DATE(SECOND_DATE , 'YYYY-MM-DD');
我需要获取结果并将其显示在网页中。
要返回结果,您可能只需要返回参考光标。这只是一个映射到JDBC ResultSet和ODBC ResultSet之类的结构的指针。对于PHP,这将是oci_new_cursor
。 Find out more。
Create or replace procedure get_recs
(FIRST_DATE in varchar2,
SECOND_DATE in varchar2,
OUT_RECS out sys_refcursor
) is
Begin
Open out_recs for
SELECT *
FROM TABLE_NAME
WHERE CREATE_DATE BETWEEN TO_DATE(FIRST_DATE, 'YYYY-MM-DD')
AND TO_DATE(SECOND_DATE , 'YYYY-MM-DD');
End;
顺便说一句,您似乎希望将参数作为字符串传递:最好将它们作为实际日期传递。