如何在存储过程(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 请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 oracle 中将 select 与 if 条件一起用于不同的表,而不是编写函数或存储过程?
oracle的存储过程中,使用select into 语句的错误