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

标签 sql oracle plsql

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


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

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/

相关文章:

mysql - 将 SQL 字符串字段转换为 unix 时间戳

sql - 使用像素检测正方形

sql - Oracle SQL : Replace all non-numeric values, 例如 NULL、空白或空字符串

sql - 在 oracle 中的 View 上触发

database - 正则表达式 不像 - Oracle 11g

sql - SQL 表与结构数组有何不同? (就用法而言,而不是实现)

mysql - 如何使使用左连接的查询更快?

xml - 如何将 XML 数据存储到 Oracle 表中

oracle - SQL 支持缓存并回退到数据库

sql - 在oracle中如何在搜索字符串时消除区分大小写