2015-01-09 2 views
0

Я хочу написать простую хранимую процедуру в Oracle с несколькими операциями select в этом. Я могу сделать то же самое на сервере SQL, какМножественный оператор select в Oracle

Create proc spc_name 
as 
begin 
select * from tab1 

Select * from tab2 
...... 
end 

Я хочу знать, как писать один и тот же эквивалент хранимой процедуры в Oracle, как я сделал в SQL Server

+0

Какую версию Oracle вы используете? Это (более или менее) возможно с помощью 12c: https://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA230 –

ответ

2

выберите * из tab1

Select * от 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> 

Если вы хотите совместить ResultSet ваших многочисленных 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> 
+0

В 12c на самом деле вы можете получить несколько результатов, например, в вопросе: https: // docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA230 –

+0

спасибо, что человек работал как шарм –

+0

Добро пожаловать! –

0

В качестве альтернативы вы можете использовать курсоры для этой цели , Пожалуйста, проверьте this или this для примера Пример.

Вы можете объявить несколько курсоров в хранимой процедуре.

Если вы хотите получать результат от Oracle Stroed Proc на Java, вероятно, вы можете обратиться this URL или это Stack Overflow answer

Смежные вопросы