参数 <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的主要内容,如果未能解决你的问题,请参考以下文章