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”的语句并检查是不是包含文本