1

我似乎无法打印光标,我做错了什么?

DECLARE
  LEADEMAIL VARCHAR2(200);
  CLIENTID NUMBER;
  v_Return ON24MASTER.WEBCAST_REPORTS.ResultSetCursor;
BEGIN
  LEADEMAIL := 'nunyo@business.com';
  CLIENTID := 22921;

  v_Return := WEBCAST_REPORTS.LEAD_BASIC_INFO(
    LEADEMAIL => LEADEMAIL,
    CLIENTID => CLIENTID
  );

    DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return);
--    :v_Return := v_Return;

END;

我收到以下错误:

Error report -
ORA-06550: line 14, column 26:
PLS-00306: wrong number or types of arguments in call to '||'
ORA-06550: line 14, column 5:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

大多数代码是直接从 SQL 开发人员运行函数中获取的。

这是包函数:

  FUNCTION LEAD_BASIC_INFO(
    leadEmail VARCHAR2,
    clientId NUMBER
  ) RETURN ResultSetCursor IS
    resultSet ResultSetCursor;
    email VARCHAR2(1000);
    webcastEngagement NUMBER(10,1);
    videoEngagement NUMBER(10,1);
    documentEngagement NUMBER(10,1);
    totalEngagement NUMBER(10,1);
    --averageEngagement NUMBER(4,1);
    totalWebcastSeconds NUMBER(10);
    engagementMinutes NUMBER(10, 1);
    last30DaysEM NUMBER(10, 1);
    last60DaysEM NUMBER(10, 1);
    fromDate DATE;
    engagementPrediction NUMBER(10);
  BEGIN...

此外,我无法使用select语句打印结果,因为该函数也具有 DML。

4

2 回答 2

3

在 Oracle 12c 中,您可以使用DBMS_SQL.RETURN_RESULT. IE,

DECLARE
  LEADEMAIL VARCHAR2(200);
  CLIENTID NUMBER;
  v_Return ON24MASTER.WEBCAST_REPORTS.ResultSetCursor;
BEGIN
  LEADEMAIL := 'nunyo@business.com';
  CLIENTID := 22921;

  v_Return := WEBCAST_REPORTS.LEAD_BASIC_INFO(
    LEADEMAIL => LEADEMAIL,
    CLIENTID => CLIENTID
  );

    DBMS_SQL.RETURN_RESULT(v_Return); 

END;

SQL*Developer 将打印结果。

于 2018-08-16T20:06:07.747 回答
2

你不能打印这样的光标;它必须将行和列隐式转换为字符串,这太过分了。该dbms_output.put_line()过程仅接受字符串参数 - 或任何可以隐式转换为字符串的参数。游标不能。

您必须遍历游标结果集,获取合适的记录类型;然后dbms_output在该循​​环中进行调用,它将结果集中的所有列值(如果您尝试模拟选择,则格式化并可能填充)连接到单个字符串中。

不知道具体是如何ON24MASTER.WEBCAST_REPORTS.ResultSetCursor定义的(大概是TYPE ResultSetCursor IS REF CURSOR),或者在您的过程中填充它的查询返回的是什么 - 哪些列名 - 很难更具体。

但是由于您已经为 SQL Developer 标记了这个,您可以使用它的内置处理 ref 游标变量,这很方便:

variable rc refcursor;

DECLARE
  LEADEMAIL VARCHAR2(200);
  CLIENTID NUMBER;
BEGIN
  LEADEMAIL := 'nunyo@business.com';
  CLIENTID := 22921;

  :rc := WEBCAST_REPORTS.LEAD_BASIC_INFO(
    LEADEMAIL => LEADEMAIL,
    CLIENTID => CLIENTID
  );

END;
/

print rc

在块之前使用命令rc声明绑定变量。在使用而不是 local 的块内,因此甚至不需要在本地声明。(注意函数赋值之前的冒号- 表示绑定变量)。然后在块之后,客户端让您使用 ref 光标。(这些文档链接适用于 SQL*Plus,但它们是SQL Developer 支持的众多命令之一。)variablev_Return:rcprint

使用虚拟包:

create or replace package WEBCAST_REPORTS AS
  TYPE ResultSetCursor IS ref cursor;
  FUNCTION LEAD_BASIC_INFO(
    leadEmail VARCHAR2,
    clientId NUMBER
  ) RETURN ResultSetCursor;
end WEBCAST_REPORTS;
/

create or replace package body WEBCAST_REPORTS AS
  FUNCTION LEAD_BASIC_INFO(
    leadEmail VARCHAR2,
    clientId NUMBER
  ) RETURN ResultSetCursor IS
    resultSet ResultSetCursor;
  BEGIN
    OPEN resultSet FOR select * from dual;
    RETURN resultSet;
  END LEAD_BASIC_INFO;
end WEBCAST_REPORTS;
/

然后我上面显示的代码作为脚本运行,在脚本输出窗口中显示:

PL/SQL procedure successfully completed.


D
-
X
于 2018-08-16T19:02:24.693 回答