我想在Oracle中编写一个简单的存储过程,其中包含多个select语句。我可以在SQL服务器中执行相同的操作,如
Create proc spc_name
as
begin
select * from tab1
Select * from tab2
......
end
我想知道如何在Oracle中编写与在SQL Server中完成相同的等效存储过程
答案 0 :(得分:2)
从tab1中选择*
从tab2中选择*
您不能在select
中简单地进行PL/SQL
查询。它会抛出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>
答案 1 :(得分:0)
或者,您可以使用游标来实现此目的。请检查this 或this示例。
您可以在存储过程中声明多个游标。
如果您想将Oracle Stroed PRoc中的结果提取到Java,您可以参考this URL或此Stack Overflow answer