我的存储过程被定义为
create or replace procedure TEST(
name IN table1.col_name%type,
price IN table1.col_price%type
)
is
begin
update table1 t set t.name =name where t.price = price;
commit;
end TEST;
我正在尝试将其作为
执行exec TEST(name => 'John', price => 1000);
但是,它会产生无效的SQL错误。我在这里缺少什么?
答案 0 :(得分:2)
您的输入参数%type
语句声称列名称为col_name
和col_price
。但这不是您在存储过程中引用它们的方式(name
和price
)。
在列名称后命名变量时可能会发生错误。 AskTom建议使用变量命名约定的有限约定:
L_
P_
G_
该链接对PL / SQL命名约定进行了很好的一般性讨论。我个人只对大多数变量使用V_
(除了索引和其他明显的东西),但这只是我。
最后,列名中的col_
似乎是多余的;只需使用name
和price
作为列名。
所以,那就是说,我认为这可以做你想要的:
create table table1 (
name varchar2(30),
price number
);
create or replace procedure TEST(
p_name IN table1.name%type,
p_price IN table1.price%type
)
is
begin
update table1
set name = p_name
where price = p_price;
commit;
end TEST;
/
insert into table1 values ('John', 500);
commit;
select * from table1;
exec TEST(p_name => 'Bob', p_price => 500);
select * from table1;
-- Clean up test artifacts
drop procedure test;
drop table table1;
给出输出:
table TABLE1 created.
PROCEDURE TEST compiled
1 rows inserted.
committed.
NAME PRICE
------------------------------ ----------
John 500
anonymous block completed
NAME PRICE
------------------------------ ----------
Bob 500
procedure TEST dropped.
table TABLE1 dropped.
答案 1 :(得分:0)
我真的不明白变量前缀方法。 Oracle不会使用他们自己的API,如果他们这样做,那将是非常恼人的。它似乎总是一种解决方法,而不是修复。
对我来说,修复方法是使用过程名称命名变量。它使参数名称保持“干净”并使您的代码100%证明不会被捕获:
create or replace procedure TEST(
name IN table1.col_name%type,
price IN table1.col_price%type)
is
begin
update table1 t
set name = test.name
where t.price = price;
commit;
end TEST;
有关捕获here的更多信息。