我有一个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?
答案 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列。但这取决于你是否还好。