Oracle 中的多个 select 语句
Multiple select statement in Oracle
我想在 Oracle 中编写一个简单的存储过程,其中包含多个 select 语句。我可以在 SQL 服务器中像
一样做同样的事情
Create proc spc_name
as
begin
select * from tab1
Select * from tab2
......
end
我想知道如何在 Oracle 中编写与我在 SQL 服务器
中所做的相同的等效存储过程
您也可以使用游标来达到此目的。请检查 this
或 this 示例。
您可以在存储过程中声明多个游标。
如果你想从 Oracle Stroed PROc 获取结果到 Java 可能你可以参考 this URL or this Stack Overflow answer
select * from tab1
Select * from tab2
您不能简单地在 PL/SQL
中进行 select
查询。它会抛出 PLS-00428: an INTO clause is expected in this SELECT statement
错误。
要么使用 SELECT..INTO
子句,要么使用 CURSORS
。 SELECT INTO 子句用于检索一行或一组列。它用于将 returned 数据存储到预定义变量中。对于多个 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>
要 return 多行,您可以使用 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>
我想在 Oracle 中编写一个简单的存储过程,其中包含多个 select 语句。我可以在 SQL 服务器中像
一样做同样的事情Create proc spc_name
as
begin
select * from tab1
Select * from tab2
......
end
我想知道如何在 Oracle 中编写与我在 SQL 服务器
中所做的相同的等效存储过程您也可以使用游标来达到此目的。请检查 this 或 this 示例。
您可以在存储过程中声明多个游标。
如果你想从 Oracle Stroed PROc 获取结果到 Java 可能你可以参考 this URL or this Stack Overflow answer
select * from tab1
Select * from tab2
您不能简单地在 PL/SQL
中进行 select
查询。它会抛出 PLS-00428: an INTO clause is expected in this SELECT statement
错误。
要么使用 SELECT..INTO
子句,要么使用 CURSORS
。 SELECT INTO 子句用于检索一行或一组列。它用于将 returned 数据存储到预定义变量中。对于多个 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>
要 return 多行,您可以使用 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>