Oracle中的多个选择语句

Posted

技术标签:

【中文标题】Oracle中的多个选择语句【英文标题】:Multiple select statement in Oracle 【发布时间】:2015-01-09 06:03:32 【问题描述】:

我想在 Oracle 中编写一个简单的存储过程,其中包含多个选择语句。我可以在 SQL 服务器中做同样的事情,比如

Create proc spc_name
as
begin
select * from tab1

Select * from tab2
......
end

我想知道如何在 Oracle 中编写与在 SQL Server 中相同的等效存储过程

【问题讨论】:

您使用的是哪个 Oracle 版本?这在 12c 中(或多或少)是可能的:docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA230 【参考方案1】:

从 tab1 中选择 *

从 tab2 中选择 *

您不能简单地在PL/SQL 中使用select 查询。它会抛出PLS-00428: an INTO clause is expected in this SELECT statement 错误。

要么使用SELECT..INTO 子句,要么使用CURSORS。 SELECT INTO 子句用于检索一行或一组列。它用于将返回的数据存储到预定义的变量中。对于多个 SELECT,您可以有多个 SELECT INTO 子句,每个子句将存储各自 SQL 的结果。

例如,

SQL> DECLARE
  2    v_ename emp.ename%TYPE;
  3    v_empno emp.empno%TYPE;
  4  BEGIN
  5    SELECT ename INTO v_ename FROM emp WHERE empno = 7369;
  6    SELECT empno INTO v_empno FROM emp WHERE ename = 'SCOTT';
  7    dbms_output.put_line('SELECT statement 1 returns name =: '||v_ename);
  8    dbms_output.put_line('SELECT statement 2 returns emp number =: '||v_empno)
  9  END;
 10  /
SELECT statement 1 returns name =: SMITH
SELECT statement 2 returns emp number =: 7788

PL/SQL procedure successfully completed.

SQL>

要返回多行,您可以使用CURSOR。在您的情况下,使用多个语句,您可以有两个 REFCURSOR

例如,

SQL> variable v_ref1 refcursor
SQL> variable v_ref2 refcursor
SQL>
SQL> DECLARE
  2    v_ref1 sys_refcursor;
  3    v_ref2 sys_refcursor;
  4  BEGIN
  5    OPEN :v_ref1 FOR SELECT empno, ename
  6       FROM emp ORDER BY empno
  7    FETCH FIRST 5 ROWS ONLY;
  8    OPEN :v_ref2 FOR SELECT empno, ename
  9       FROM emp ORDER BY empno DESC
 10    FETCH FIRST 5 ROWS ONLY;
 11  END;
 12  /

PL/SQL procedure successfully completed.

SQL> print v_ref1

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN

SQL> print v_ref2

     EMPNO ENAME
---------- ----------
      7934 MILLER
      7902 FORD
      7900 JAMES
      7876 ADAMS
      7844 TURNER

SQL>

如果您想组合多个SELECT 语句的结果集,您可以使用UNION 运算符并将其放在单个REFCURSOR 中。鉴于列数据类型匹配且顺序正确。这只是一个例子,

SQL> variable v_ref refcursor
SQL>
SQL> DECLARE
  2    v_ref sys_refcursor;
  3  BEGIN
  4    OPEN :v_ref FOR
  5      SELECT empno, DEPTNO FROM emp WHERE ROWNUM <=5
  6         UNION ALL
  7      SELECT empno, DEPTNO FROM EMP WHERE ROWNUM <=5;
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL> print v_ref

     EMPNO     DEPTNO
---------- ----------
      7369         20
      7499         30
      7521         30
      7566         20
      7654         30
      7369         20
      7499         30
      7521         30
      7566         20
      7654         30

10 rows selected.

SQL>

【讨论】:

在 12c 中,您实际上可以有多个结果,例如问题中的:docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA230【参考方案2】:

您也可以为此使用游标。请查看this 或this 示例。

您可以在一个存储过程中声明多个游标。

如果您想从 Oracle Stroed PROc 获取结果到 Java,您可以参考 this URL 或 Stack Overflow answer

【讨论】:

以上是关于Oracle中的多个选择语句的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本

Oracle 12c - 插入到选择查询中的不明确列,ORA-00918

Oracle 选择多条记录的最大日期

Oracle 给表加多个字段

ORACLE 中 SQL语句优化

选择中的 if 语句 (ORACLE)