pl / sql程序执行给出错误

时间:2013-05-21 22:46:05

标签: plsql plsqldeveloper

我的存储过程被定义为

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错误。我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

您的输入参数%type语句声称列名称为col_namecol_price。但这不是您在存储过程中引用它们的方式(nameprice)。

在列名称后命名变量时可能会发生错误。 AskTom建议使用变量命名约定的有限约定:

  • 本地变量以L_
  • 开头
  • 参数以P_
  • 开头
  • 全局包变量以G_
  • 开头

该链接对PL / SQL命名约定进行了很好的一般性讨论。我个人只对大多数变量使用V_(除了索引和其他明显的东西),但这只是我。

最后,列名中的col_似乎是多余的;只需使用nameprice作为列名。

所以,那就是说,我认为这可以做你想要的:

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的更多信息。