oracle - 存储过程-SQL Developer
问题描述
问题:编写一个存储过程,它接受camperid、category、chargeate 和amount 作为输入参数,并有一个varchar2 类型的输出参数,其中包含一条消息。o 如果露营者 ID 不是有效的露营者 ID,则输出参数应设置为“错误:没有此类露营者 ID”。o 如果类别不是有效类别,则输出参数应设置为“错误:没有此类收费类别”。o 如果金额不在正确范围内,则输出参数应设置为“错误:金额必须 >0 且不超过 40 美元”。o 如果金额会导致总花费超过该露营者的预算,则输出参数应设置为“错误:资金不足”。这是我的查询
create or replace procedure P_STORED
(c_camperid in charges.camperid%type,c_category in charges.camperid%type, c_chargedate in charges.camperid%type, c_amt in charges.camperid%type,
c_message out varchar2 )
as
p_camperid charges.camperid%type;
c_cat charges.category%type;
a_amt charges.amt%TYPE;
c_date charges.chargedate%type;
p_error varchar2(5);
begin
v_error := 'False';
select c.camperid, c.category
into p_camperid, c_cat
from charges c
where c.camperid = c_camperid;
if p_camperid = c.camperid then
v_error := 'true';
c_message := 'Camper ' || c_camperid || ' exists';
else
v_error := 'False';
c_message := 'Error: no such camper ID (' || c_camperid || ')';
end if;
if c_cat = c.category then
v_error := 'true';
c_message := 'Category ' || c_cat || ' exists';
else
v_error := 'False';
c_message := 'Error: no such charge category (' || c_cat || ')';
end if;
if(a_amt >0 and a_amt < 40) then
v_error := 'true';
c_message := 'Amount ' || a_amt|| ' is with in range';
else
v_error := 'False';
c_message := 'amount must be >0 and no more than $ 40.';
end if;
if(campers.spent < campers.budget) then
c_message := 'Amount ' || a_amt|| ' is under budget';
else
c_message := 'ERROR: insufficient funds';
end;
我收到此错误 LINE/COL ERROR
41/5 PLS-00103:遇到符号“;” 预期以下情况之一时:如果错误:检查编译器日志
解决方案
当你只需要一个露营者 ID 时,你为什么要传递一大堆参数(其余的你什么也不用做)?那只是没有意义...
这是一个显示如何执行此操作的选项。
样品表:
SQL> select * from charges;
CAMPERID CATEGORY CHARGEDATE AMT
---------- ---------- ------------------- ----------
1 Category 1 12.10.2021 00:00:00 500
SQL>
程序:
SQL> create or replace procedure p_test
2 (par_camperid in charges.camperid%type,
3 par_message out varchar2
4 )
5 as
6 l_camperid charges.camperid%type;
7 begin
8 select c.camperid
9 into l_camperid
10 from charges c
11 where c.camperid = par_camperid;
12
13 par_message := 'Camper ' || par_camperid || ' exists';
14 exception
15 when no_data_found then
16 par_message := 'Error: no such camper ID (' || par_camperid || ')';
17 end;
18 /
Procedure created.
测试:
SQL> set serveroutput on;
SQL> declare
2 l_msg varchar2(100);
3 begin
4 p_test(1, l_msg);
5 dbms_output.put_line(l_msg);
6 end;
7 /
Camper 1 exists
PL/SQL procedure successfully completed.
SQL> declare
2 l_msg varchar2(100);
3 begin
4 p_test(2, l_msg);
5 dbms_output.put_line(l_msg);
6 end;
7 /
Error: no such camper ID (2)
PL/SQL procedure successfully completed.
SQL>
你写的代码:
- 错别字,错别字,错别字……是它
p_error
还是p_erorr
? if
应该有end if
if
不能包含select
语句(必须单独选择值,然后在中使用if
)where
条件不对。永远不要将参数命名为与列名相同的名称。This:where camperid = camperid
等于where 1 = 1
并且您将从表中获取所有行,而不仅仅是您要查找的行
推荐阅读
- entity-framework-core - 如何使用 EF Core 插入 00000000-0000-0000-0000-000000000000?
- php - 表单中的必填字段
- angular - Angular 5 HttpResponse 状态 412 未捕获
- javascript - 来自反应客户端的请求量后,带有 express 的 socket.io 变慢
- java - 不同集合中的密码和用户名(Spring 安全性)
- image - 在燃气表上执行 OCR
- javascript - ES3 的 Javascript getter/setter
- virtualization - Windows 10 中的虚拟(假)主显示器?
- java - Java WSDL 以 xml 格式返回字符串
- xpath - 具有以下特定兄弟情况的 XPath