我似乎无法打印光标,我做错了什么?
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
之前的冒号 - 表示绑定变量(。然后在块之后,客户端允许您print
ref 光标。(这些文档链接适用于 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