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

Posted

技术标签:

【中文标题】如何在存储过程(Oracle)中使用 SELECT 请求?【英文标题】:How to use SELECT request in stored procedure (Oracle)? 【发布时间】:2018-10-20 05:50:24 【问题描述】:

我使用 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语句返回多行,是不是需要使用游标?

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

【问题讨论】:

试试DBMS_SQL.RETURN_RESULT oracle-base.com/articles/12c/… 您的select 语句没有错误,但是我建议您定义列而不是“*”。 'select 返回一个结果集,你不需要游标。 你打算如何处理选中的数据?在您的存储过程中处理它?还是传递给其他程序使用? @KaushikNayak 谢谢你的链接。我使用该链接中的信息来创建 PROCEDURE。可以再看一下我的帖子吗,我补充一下。对不对? @MohammadMohabbati 好的,你能再看看我的帖子吗?我添加了我的 PROCEDURE 代码。你觉得对还是错? 【参考方案1】:

在存储过程中如何正确使用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 列,作为输出,我需要设置所有列吗?

您可以选择创建十五个不同的变量。但是,如果查询的投影与表的投影匹配(与 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');

我需要获取结果并在网页中显示该数据。

对于返回结果,您可能只需要返回一个 Ref Cursor。这只是一个映射到 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;

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

【讨论】:

谢谢老哥详细解答! :) 顺便问一下,你能再看看我的帖子吗?我添加了我当前程序的代码。正确与否?我可以再问你一个问题吗?我的 PHP (5.5) 应用程序位于“Windows Server 2008 R2”中。 Oracle 12c 数据库位于另一台远程服务器中。我尝试使用oci_connect 连接oracle 和php。 php应用程序所在的服务器是否需要安装“Instant Client”? 这真的是一个不同的问题。我不是 PHP 猎犬,但通常将 Oracle 客户端库安装在与需要连接到 Oracle 的客户端相同的位置。

以上是关于如何在存储过程(Oracle)中使用 SELECT 请求?的主要内容,如果未能解决你的问题,请参考以下文章

PL_sql如何执行oracle存储过程

如何在 oracle 中将 select 与 if 条件一起用于不同的表,而不是编写函数或存储过程?

如何解决oracle存储过程select into问题

oracle的存储过程中,使用select into 语句的错误

在oracle中创建带参存储过程,传进去的参数可以为空么?在存储过程中要如何判断传进来的值是不是为空。

oracle 如何终止存储过程的运行!