我从现有过程创建了一个包,过程只给出了准确的输出,但在创建包时没有错误,但它没有显示我传递给光标的输出文件
----------------包装如下------------------------
SET SERVEROUTPUT ON;
CREATE OR REPLACE PACKAGE user.report AS
PROCEDURE distribution (
code_in IN user.test.schm_code%TYPE,
fromdate IN DATE,
todate IN DATE
);
END report;
/
-------------------------------------------------
----------------Package Body---------------------
-------------------------------------------------
CREATE OR REPLACE PACKAGE BODY user.report as
----------------------------------------------
----------VARIABLE DECLARATION----------------
----------------------------------------------
code_in user.test.code%TYPE;
fromdate DATE;
todate DATE;
v_code user.test.code%TYPE;
v_count number;
v_code user.test.acct_crncy_code%TYPE;
v_amount number(17,4);
-----------------------------------------------
---------------CURSOR DECLARATION--------------
-----------------------------------------------
CURSOR td_data IS
( SELECT
test.code,
COUNT(test.code) AS count,
test.crncy
FROM
user.table1
JOIN user.test ON test.id = table1.id
WHERE
user.test.opendate BETWEEN TO_DATE(fromdate, 'dd-mm-yyyy') AND TO_DATE(todate, 'dd-mm-yyyy')
and
user.test.code = code_in
GROUP BY
test.code,test.crncy
);
------------------------PROCEDURE CREATION-----------------------
PROCEDURE distribution
(
code_in IN user.test.code%TYPE,
fromdate IN DATE,
todate IN DATE
)
AS
BEGIN
dbms_output.put_line('code'||' '||'COUNT'||' '||'TOTAL');
OPEN td_data;
LOOP
FETCH td_data INTO v_code,v_count,v_code,v_amount;
EXIT WHEN td_data%notfound;
dbms_output.put_line(v_code
|| ' '
||v_count
|| ' '
||v_code
||' '
||v_amount
);
END LOOP;
CLOSE td_data;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END distribution;
END report;
/
BEGIN
user.report.distribution('x1fsr','01-02-2016','01-07-2020');
END;
/
alter session set nls_date_format='dd-mm-yyyy';
我试过在没有光标工作的情况下创建包 我曾尝试在没有用户输入的情况下创建光标,但在用户输入的情况下它无法正常工作
最佳答案
您使用的变量未初始化,因此游标未获取任何内容。那是因为你声明它(以及一堆变量)全局(对于整个包体),而不是本地(对于过程,当你将参数传递给过程并且从未传递任何他们到游标。如果你坚持,创建一个参数化游标)。
此外,您已经声明了两次 V_CODE
;为什么?
无论如何:我建议你这样做:
- 使用游标
FOR
循环,因为它更易于维护(您不必打开、获取、退出、关闭 - Oracle 会为您完成) - 不要声明任何额外的变量——使用隐式游标变量
- 删除这样的异常处理程序,它一点用处都没有,因为您什么都不处理。如果您从某些前端应用程序(例如 Apex 或 Forms)调用该过程并且发生了某些事情(“其他”,嗯?),您将看不到任何内容,因为
DBMS_OUTPUT.PUT_LINE
没有在那里工作 - 因为
fromdate
和todate
是DATE
,不需要TO_DATE
它们
好的,给你:
CREATE OR REPLACE PACKAGE BODY USER.report
AS
PROCEDURE distribution (code_in IN USER.test.code%TYPE,
fromdate IN DATE,
todate IN DATE)
AS
BEGIN
DBMS_OUTPUT.put_line (
'code' || ' ' || 'COUNT' || ' ' || 'TOTAL');
FOR cur_r
IN ( SELECT test.code, COUNT (test.code) AS COUNT, test.crncy
FROM USER.table1 JOIN USER.test ON test.id = table1.id
WHERE USER.test.opendate BETWEEN fromdate AND todate
AND USER.test.code = code_in
GROUP BY test.code, test.crncy)
LOOP
DBMS_OUTPUT.put_line (
v_code
|| ' '
|| cur_r.code
|| ' '
|| cur_r.COUNT
|| ' '
|| cur_r.crncy);
END LOOP;
END distribution;
END report;
关于sql - 使用光标输入时包未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56488200/