如何在PL / SQL块中打印光标?

时间:2018-08-16 18:56:03

标签: oracle plsql oracle-sqldeveloper ref-cursor

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

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...

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

2 个答案:

答案 0 :(得分:2)

您不能像这样打印光标;它必须将行和列隐式转换为字符串,这真是太令人期待了。 dbms_output过程仅接受字符串参数-或任何可以隐式转换为字符串的参数。光标不能。

您将不得不遍历游标结果集,以获取合适的记录类型;然后在该循​​环内进行一次ON24MASTER.WEBCAST_REPORTS.ResultSetCursor调用,它将结果集中的所有列值(格式化并在您试图模拟选择项的情况下填充)组合成一个字符串。

不确切知道TYPE ResultSetCursor IS REF CURSOR的定义(大概是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 ),或者不知道在过程中填充它的查询所返回的内容-哪些列名-很难更具体。

但是,由于您已为SQL Developer标记了此标记,因此可以将其内置处理用于ref游标变量,这很方便:

rc

在块之前,用the variable command声明了绑定变量v_Return。在使用的块内,而不是使用本地:rc,因此甚至无需在本地声明。 (请注意函数分配中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; / 之前的冒号-表示绑定变量)。然后,在该块之后,客户端让您print引用光标。 (这些文档链接用于SQL * Plus,但它们在the many commands SQL Developer supports中。)

使用虚拟包装:

PL/SQL procedure successfully completed.


D
-
X

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

takeUntil

答案 1 :(得分:2)

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

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将打印结果。