如何在存储过程(Oracle)中使用SELECT请求?

时间:2018-10-20 05:50:24

标签: sql oracle plsql oracle12c

我使用 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')

问题:

  1. 如何在存储过程中正确使用SELECT请求?

  2. 该SQL语句返回多于1行,这意味着我需要使用游标吗?

  3. 如果表有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;

1 个答案:

答案 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_cursorFind 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;

顺便说一句,您似乎希望将参数作为字符串传递:最好将它们作为实际日期传递。