我在Oracle PL / SQL中编写存储过程的任务(作为作业的一部分)。有三个要求必须满足。
必须有2个参数,1 IN和1 OUT。
我必须使用隐式游标和SQL函数来计算相同类型字段数的计数(在这种情况下,类型是汽车模型,因此每个模型有多少辆汽车)。 / p>
我必须使用另一个隐式光标来显示模型的描述。
说实话,我不知所措。到目前为止,对于存储过程,我有:
CREATE OR REPLACE Procedure model_details_sp
(p_model IN VARCHAR2,
p_noofcars OUT NUMBER)
IS
BEGIN
SELECT COUNT(Model_Name) INTO p_noofcars
FROM i_car
GROUP BY Model_Name;
END;
我真的不知道从哪里开始。任何建议或指示都将受到最高的赞赏。
非常感谢。
大家好,我感谢所有评论。我对最终要求不是很清楚。我希望能够通过匿名块调用此过程,以便用户输入模型类型(& vairalbe),该过程将显示数据库中有多少个模型类型。
答案 0 :(得分:1)
在处理此类问题时,首先要考虑您要捕获的数据。
处理PL / SQL中的隐式游标需要1行,因此您需要确保理解数据。
在这种情况下,您传入的变量在您的任何查询中均未使用,因此我建议您重新评估。
我手边没有数据库来运行它,但你应该能够解决这个问题,希望能让你更近一点。我把它放在匿名块中,这样我就可以快速写出来。
DECLARE
PROCEDURE model_details_sp (p_model IN VARCHAR2, p_noofcars OUT NUMBER)
IS
p_description VARCHAR2 (200);
BEGIN
--2
SELECT COUNT (model_name)
INTO p_noofcars
FROM i_car
WHERE model_name = p_model;
DBMS_OUTPUT.put_line ('No of Cars for model: ' || p_noofcars);
--3
SELECT model_description
INTO p_description
FROM i_car --the table should be the car_model table so that only one record is returned
WHERE model_name = p_model;
DBMS_OUTPUT.put_line ('Model Desc' || p_description);
END model_details_sp;
BEGIN
dbms_output.put_line('');
END;
致@David Aldridge评论:
尝试运行它 - 结果应该是失败 - 因为你不能使用into CLAUS选择多行,除非你聚合数据:
DECLARE
p_num NUMBER;
BEGIN
SELECT LEVEL INTO p_num FROM DUAL CONNECT BY LEVEL <= 10;
dbms_output.put(p_num);
END;
您应该看到的错误是:
错误报告:
ORA-01422:精确提取返回超过请求的行数 ORA-06512:第4行 01422. 00000 - “确切的提取返回超过请求的行数” *原因:精确提取中指定的数字小于返回的行数。 *操作:重写查询或更改请求的行数
答案 1 :(得分:0)
从描述和后续评论中,这是我将提供的解决方案:
DECLARE
PROCEDURE model_details_sp
(p_model IN VARCHAR2,
p_noofcars OUT NUMBER)
IS
BEGIN
SELECT COUNT(*)
INTO p_noofcars
FROM i_car
WHERE model_name = p_model;
END;
no_of_cars NUMBER := 0;
BEGIN
model_details_sp(:model_name, no_of_cars);
dbms_output.put_line('no of cars for ' || :model_name || ' = ' || no_of_cars);
END;
我已经在线创建了PROCEDURE,但您可以通过从声明部分中删除它并使用CREATE OR REPLACE执行它来轻松地将其提取到数据库。
此示例假定在执行匿名块时使用支持绑定变量替换(:model_name)的IDE。例如,在TOAD中,将提示“user”为:model_name。
提供值