您的输入参数%type
语句声称列名是col_name
and col_price
。但这不是您在存储过程(name
和price
)中引用它们的方式。
当您在列名之后命名变量时,可能会发生不好的事情。AskTom建议使用有限的变量命名约定:
该链接对 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.