参数 <Proc_Name> 的编号或类型错误,最后一条记录显示两次 - PL SQL

Posted

技术标签:

【中文标题】参数 <Proc_Name> 的编号或类型错误,最后一条记录显示两次 - PL SQL【英文标题】:Wrong Number or type of argument <Proc_Name> and Last record got displayed twice - PL SQL 【发布时间】:2018-05-30 09:05:48 【问题描述】:
CREATE OR REPLACE AVG_MARK
(
    CROLL_NUM OUT TEST_TBL.ROLL_NUM%type,
    CNAME OUT TEST_TBL.NAME%type,
    CAVG_SALARY OUT TEST_TBL.SALARY%type
    CRANK OUT INTEGER
)
AS 
CURSOR C1 IS 
    SELECT ROLL_NUM, NAME, SALARY, RANK() OVER ORDER BY SALARY DESC) AS RNK
    FROM TEST_TBL;
BEGIN
OPEN C1;
    LOOP
        FETCH C1 INTO CROLL_NUM , CNAME , CAVG_SALARY , CRANK;
        DBMS_OUTPUT.PUT_LINE(CROLL_NUM  ||','|| CNAME ||','|| CAVG_SALARY ||','|| CRANK);
        EXIT WHEN C1%NOTFOUND
    END LOOP;
CLOSE C1;
END;

内部选择查询返回 5 条记录

    我可以在 proc 上编译,但在执行时说 “调用 AVG_MARK 时参数的数量或类型错误”

    在打开 Proc 并执行时,它会连接到数据库并显示记录,但最后一条记录会重复两次。

请就这个问题提出建议

【问题讨论】:

请检查我的回答并接受它是否对您有帮助或为给定的解决方案提供相关反馈(cmets)。请阅读:***.com/help/someone-answers 了解为什么它很重要。 【参考方案1】:

不确定如何将值传递给过程。我用一些记录创建了一个像你这样的示例表,它对我有用。我在过程中所做的唯一更改是修复一些语法错误并将EXIT WHEN 紧跟在FETCH 之后。这就是为什么您看到最后一条记录重复的原因。

CREATE OR replace PROCEDURE avg_mark (croll_num   OUT test_tbl.roll_num%TYPE, 
                                      cname       OUT test_tbl.name%TYPE, 
                                      cavg_salary OUT test_tbl.salary%TYPE, 
                                      crank       OUT INTEGER) 
AS 
  CURSOR c1 IS 
    SELECT roll_num, 
           name, 
           salary, 
           RANK() 
             over ( 
               ORDER BY salary DESC) AS RNK 
    FROM   test_tbl; 
BEGIN 
    OPEN c1; 

    LOOP 
        FETCH c1 INTO croll_num, cname, cavg_salary, crank; 

        EXIT WHEN c1%NOTFOUND; 

        dbms_output.put_line(croll_num 
                             ||',' 
                             || cname 
                             ||',' 
                             || cavg_salary 
                             ||',' 
                             || crank); 
    END LOOP; 

    CLOSE c1; 
END; 

/ 

这是调用。

DECLARE 
    v_croll_num   test_tbl.roll_num%TYPE; 
    v_cname       test_tbl.name%TYPE; 
    v_cavg_salary test_tbl.salary%TYPE; 
    v_crank       INTEGER; 
BEGIN 
    avg_mark(v_croll_num, v_cname, v_cavg_salary, v_crank); 
END; 

/ 

O/p

1,Kaushik,1000000000,1
2,Rhodes,1000,2

DB Fiddle Demo

【讨论】:

我没有看到你提到的任何语法错误。 @BarbarosÖzhan :就这两个愚蠢的,RANK() OVER ORDER BY SALARY DESC) 括号不见了。 EXIT WHEN 。缺少分号。 非常感谢.. 当我在 DBMS_OUTPUT 之前放置 EXIT 语句时它可以工作

以上是关于参数 <Proc_Name> 的编号或类型错误,最后一条记录显示两次 - PL SQL的主要内容,如果未能解决你的问题,请参考以下文章

linux中的kill命令

mysql基础之sqlAchemy

grep

linux下grep命令详解

chattr命令

Functional Ruby