gpt4 book ai didi

sql - 使用光标输入时包未执行

转载 作者:行者123 更新时间:2023-12-02 00:52:32 25 4
gpt4 key购买 nike

我从现有过程创建了一个包,过程只给出了准确的输出,但在创建包时没有错误,但它没有显示我传递给光标的输出文件


----------------包装如下------------------------

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 没有在那里工作
  • 因为 fromdatetodateDATE,不需要 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com