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

瓦森特·戈帕拉克里希南(Vasant Gopalakrishnan)

我有一个简单的选择查询,需要将其放入存储过程中。该查询接受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:
拉利特·库马尔(Lalit Kumar B)

不需要(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>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在JDBC中调用存储过程

如何在Strongloop中调用存储过程

如何在c#中获取存储过程输出参数

如何在List <>中捕获此存储过程的结果?

如何在临时表中显示存储过程的结果?

如何在Xamarin中从Android调用SQL Server存储过程

如何在Java代码中从Postgresql调用存储过程

我如何在php中调用存储过程?

如何在npgsql中调用存储过程获取游标数据

如何在neo4jclient中调用存储过程?

如何在 Nifi 中调用 Bigquery 存储过程

如何在Postgresql中编写存储过程并调用php代码?

如何在SQL Server中检查调用存储过程

如何在 Spring Boot 中调用存储过程?

如何在 Laravel 5 中调用 postgresql 存储过程

如何从存储过程中获取输出参数结果和查询结果?

如何在ado.net中使用输出参数并选择SQL Server存储过程的查询结果?

如何从聚合输出中拉平JSON结果

如何使用C#中的Entity Framework从存储过程中获取输出结果?

如何在Laravel上调用存储过程?

如何处理由DB2中的存储过程内部调用的存储过程返回的结果集

如何使用mysql使用输入和输出参数在Entity Framework Core中调用存储过程

如何使用输出参数在 EF6 中调用存储过程

如何从 ASP.NET 中的 Mysql 存储过程调用输出参数

如何使对Oracle中存储过程的调用排队?

如何使用C#调用带输出的存储过程

从存储过程调用中返回变量作为变量的输出值

如何在Elasticsearch聚合存储桶中删除重复的结果文档?

如何在oracle plsql中的存储过程中过滤和检索特定字符后的结果?