如何在输出中调用具有聚合结果的存储过程?

Posted

技术标签:

【中文标题】如何在输出中调用具有聚合结果的存储过程?【英文标题】:How to call a Stored procedure with aggregate result in output? 【发布时间】:2015-04-23 10:13:52 【问题描述】:

我有一个需要放入存储过程的简单选择查询。 该查询接受 3 个参数并显示 2 列作为结果,其中之一是聚合。

CREATE OR REPLACE PROCEDURE "B_SP_GET_TOTAL_CLOCKED_IN_TIME"
(
     cv_1 IN OUT TYPES.cursorType,
     p_PARENT_CLIENT_ID IN NUMBER DEFAULT 10000,
     p_START_TIME IN NVARCHAR2,
     p_END_TIME IN NVARCHAR2
)
AS
v_sql VARCHAR2(4000);
BEGIN
v_sql := 'SELECT b.CLIENT_NAME, ROUND(SUM((a.ENDTIME-a.STARTTIME)*24*60),2) TOTAL_CLOCKIN_TIME
      FROM TIMESHEET a
      INNER JOIN CLIENTS b ON a.CLIENT_ID = b.CLIENT_ID
      INNER JOIN CLOCKACTIONS c ON c.ID = a.CLOCKACTIONID
      WHERE a.STARTTIME > p_START_TIME AND a.ENDTIME < p_END_TIME AND b.PARENT_CLIENT_ID = p_PARENT_CLIENT_ID 
      GROUP BY b.CLIENT_NAME';    
    OPEN cv_1 FOR v_sql;
END;

我执行了存储过程,它被编译了,没有任何问题。 我如何检查它是否正常工作?至于我现在如何测试它?

我用来测试上述程序的语句可以在下面找到:

execute B_SP_GET_TOTAL_CLOCKED_IN_TIME(10000,'04-01-2015 00:00:00','05-01-2015 00:00:00');

这是我得到的错误:

 Error starting at line : 1 in command - execute B_SP_GET_TOTAL_CLOCKED_IN_TIME(10000,'04-01-2015 00:00:00','05-01-2015 00:00:00') 
Error report - ORA-06550: line 1, column 7: 
PLS-00306: wrong number or types of arguments in call to 'B_SP_GET_TOTAL_CLOCKED_IN_TIME' 
ORA-06550: line 1, column 7: PL/SQL: Statement ignored
    06550. 00000 -  "line %s, column %s:\n%s"
    *Cause:    Usually a PL/SQL compilation error.
    *Action:

【问题讨论】:

p_START_TIME 是一个参数,但您已将其硬编码在字符串中。使用连接运算符 || 动态构建它。 您使用动态 SQL 有什么原因吗? 同意@Sathya,其实这里不需要动态sql。使用 OPEN FOR SELECT 并传递参数,在 PL/SQL 中它将被称为绑定变量本身。 【参考方案1】:

不需要(ab)使用动态SQL。您可以简单地使用 OPEN FOR SELECT 并使用 SYS_REFCURSOR

例如,

SQL> CREATE OR REPLACE
  2  PROCEDURE p_get_emp(
  3      p_deptno IN emp.deptno%TYPE,
  4      p_ref OUT SYS_REFCURSOR)
  5  AS
  6  BEGIN
  7    OPEN   p_ref FOR
  8    SELECT ename,
  9           empno,
 10           deptno
 11    FROM   emp
 12    WHERE  deptno = p_deptno
 13    ORDER BY empno;
 14  END p_get_emp;
 15  /

Procedure created.

SQL>
SQL> sho err
No errors.
SQL>

程序创建没有任何错误。让我们测试一下:

SQL> var p_ref refcursor
SQL>
SQL> EXEC p_get_emp  (30, :p_ref);

PL/SQL procedure successfully completed.

SQL>
SQL> print p_ref

ENAME           EMPNO     DEPTNO
---------- ---------- ----------
ALLEN            7499         30
WARD             7521         30
MARTIN           7654         30
BLAKE            7698         30
TURNER           7844         30
JAMES            7900         30

6 rows selected.

SQL>

【讨论】:

以上是关于如何在输出中调用具有聚合结果的存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

VB调用SQL存储过程异步执行问题

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀

sql server存储过程如何输出结果集

oracle存储过程如何输出信息

存储过程调用存储过程

oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,