我似乎无法打印光标,我在做什么错了?
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
语句打印结果。
答案 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将打印结果。