将具有不同返回的两个select语句组合到单个视图中

时间:2015-01-12 09:29:59

标签: sql tsql plsql oracle11g

我有一个T-SQL存储过程我试图转换为PL-SQL。

目前,此存储过程执行一个非常长的选择查询,紧接着是一个更短的选择查询。它看起来像这样:

CREATE PROCEDURE proc_name        
    @userid    int,
AS          
    select   (about twenty fields)
    from     (about five tables)
    where    something = @userid

    select   (about five fields)
    from     (about three tables)
    where    something = @userid

当我看到这个时,我首先想到的是将它转换为视图,因为它只是在做一个select语句。但是,考虑到正在进行两项选择,这实际上是否可行?可以使用存储过程吗?我已经尝试过这个想法,但据我所知,我需要创建两个sys_refcursors,这意味着调用代码需要以不同的方式处理两个查询返回,这是当前不必进行的。

所以问题是:如何将这种类型的过程从T-SQL转换为PL-SQL?

2 个答案:

答案 0 :(得分:1)

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

要返回多行,您可以使用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)

通过使第一个选择查询中不存在的字段为NULL,您可以使第二个选择查询具有20列。但这取决于你是否还好。