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



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

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。

在 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*开发人员将打印结果。

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

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

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

但是,由于您已经为 SQL 开发人员标记了此内容,因此您可以使用其对 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

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

使用虚拟包装:

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

最新更新